mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	hle: kernel: Migrate KTransferMemory to KAutoObject.
This commit is contained in:
		
							parent
							
								
									7444963bbb
								
							
						
					
					
						commit
						c7d8b7421c
					
				| @ -221,6 +221,8 @@ add_library(core STATIC | ||||
|     hle/kernel/k_thread.h | ||||
|     hle/kernel/k_thread_queue.h | ||||
|     hle/kernel/k_trace.h | ||||
|     hle/kernel/k_transfer_memory.cpp | ||||
|     hle/kernel/k_transfer_memory.h | ||||
|     hle/kernel/k_writable_event.cpp | ||||
|     hle/kernel/k_writable_event.h | ||||
|     hle/kernel/kernel.cpp | ||||
| @ -247,8 +249,6 @@ add_library(core STATIC | ||||
|     hle/kernel/svc_wrap.h | ||||
|     hle/kernel/time_manager.cpp | ||||
|     hle/kernel/time_manager.h | ||||
|     hle/kernel/transfer_memory.cpp | ||||
|     hle/kernel/transfer_memory.h | ||||
|     hle/lock.cpp | ||||
|     hle/lock.h | ||||
|     hle/result.h | ||||
|  | ||||
| @ -59,7 +59,8 @@ ResultVal<Handle> HandleTable::Create(Object* obj) { | ||||
|     case HandleType::WritableEvent: | ||||
|     case HandleType::ClientSession: | ||||
|     case HandleType::ServerSession: | ||||
|     case HandleType::Session: { | ||||
|     case HandleType::Session: | ||||
|     case HandleType::TransferMemory: { | ||||
|         Handle handle{}; | ||||
|         Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); | ||||
|         return MakeResult<Handle>(handle); | ||||
|  | ||||
| @ -14,6 +14,7 @@ | ||||
| #include "core/hle/kernel/k_memory_manager.h" | ||||
| #include "core/hle/kernel/k_session.h" | ||||
| #include "core/hle/kernel/k_shared_memory.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/k_system_control.h" | ||||
| #include "core/hle/kernel/k_thread.h" | ||||
| #include "core/hle/kernel/memory_types.h" | ||||
| @ -28,6 +29,7 @@ namespace Kernel::Init { | ||||
|     HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__)                                         \ | ||||
|     HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__)                                         \ | ||||
|     HANDLER(KEvent, (SLAB_COUNT(KEvent)), ##__VA_ARGS__)                                           \ | ||||
|     HANDLER(KTransferMemory, (SLAB_COUNT(KTransferMemory)), ##__VA_ARGS__)                         \ | ||||
|     HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__)                             \ | ||||
|     HANDLER(KSession, (SLAB_COUNT(KSession)), ##__VA_ARGS__) | ||||
| 
 | ||||
|  | ||||
| @ -216,8 +216,6 @@ public: | ||||
|     constexpr PAddr GetPhysicalAddr(VAddr addr) { | ||||
|         return page_table_impl.backing_addr[addr >> PageBits] + addr; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     constexpr bool Contains(VAddr addr) const { | ||||
|         return address_space_start <= addr && addr <= address_space_end - 1; | ||||
|     } | ||||
| @ -225,6 +223,8 @@ private: | ||||
|         return address_space_start <= addr && addr < addr + size && | ||||
|                addr + size - 1 <= address_space_end - 1; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     constexpr bool IsKernel() const { | ||||
|         return is_kernel; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										45
									
								
								src/core/hle/kernel/k_transfer_memory.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/core/hle/kernel/k_transfer_memory.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| // Copyright 2021 yuzu emulator team
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "core/hle/kernel/k_resource_limit.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| KTransferMemory::KTransferMemory(KernelCore& kernel) | ||||
|     : KAutoObjectWithSlabHeapAndContainer{kernel} {} | ||||
| 
 | ||||
| KTransferMemory::~KTransferMemory() = default; | ||||
| 
 | ||||
| ResultCode KTransferMemory::Initialize(VAddr address_, std::size_t size_, | ||||
|                                        Svc::MemoryPermission owner_perm_) { | ||||
|     // Set members.
 | ||||
|     owner = kernel.CurrentProcess(); | ||||
| 
 | ||||
|     // TODO(bunnei): Lock for transfer memory
 | ||||
| 
 | ||||
|     // Set remaining tracking members.
 | ||||
|     owner->Open(); | ||||
|     owner_perm = owner_perm_; | ||||
|     address = address_; | ||||
|     size = size_; | ||||
|     is_initialized = true; | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| void KTransferMemory::Finalize() { | ||||
|     // Perform inherited finalization.
 | ||||
|     KAutoObjectWithSlabHeapAndContainer<KTransferMemory, KAutoObjectWithList>::Finalize(); | ||||
| } | ||||
| 
 | ||||
| void KTransferMemory::PostDestroy(uintptr_t arg) { | ||||
|     Process* owner = reinterpret_cast<Process*>(arg); | ||||
|     owner->GetResourceLimit()->Release(LimitableResource::TransferMemory, 1); | ||||
|     owner->Close(); | ||||
| } | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
							
								
								
									
										82
									
								
								src/core/hle/kernel/k_transfer_memory.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/core/hle/kernel/k_transfer_memory.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| // Copyright 2021 yuzu emulator team
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| 
 | ||||
| #include "core/hle/kernel/slab_helpers.h" | ||||
| #include "core/hle/kernel/svc_types.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
| union ResultCode; | ||||
| 
 | ||||
| namespace Core::Memory { | ||||
| class Memory; | ||||
| } | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| class KernelCore; | ||||
| class Process; | ||||
| 
 | ||||
| class KTransferMemory final | ||||
|     : public KAutoObjectWithSlabHeapAndContainer<KTransferMemory, KAutoObjectWithList> { | ||||
|     KERNEL_AUTOOBJECT_TRAITS(KTransferMemory, KAutoObject); | ||||
| 
 | ||||
| public: | ||||
|     explicit KTransferMemory(KernelCore& kernel); | ||||
|     ~KTransferMemory() override; | ||||
| 
 | ||||
|     static constexpr HandleType HANDLE_TYPE = HandleType::TransferMemory; | ||||
| 
 | ||||
|     ResultCode Initialize(VAddr address_, std::size_t size_, Svc::MemoryPermission owner_perm_); | ||||
| 
 | ||||
|     virtual void Finalize() override; | ||||
| 
 | ||||
|     virtual bool IsInitialized() const override { | ||||
|         return is_initialized; | ||||
|     } | ||||
| 
 | ||||
|     virtual uintptr_t GetPostDestroyArgument() const override { | ||||
|         return reinterpret_cast<uintptr_t>(owner); | ||||
|     } | ||||
| 
 | ||||
|     static void PostDestroy(uintptr_t arg); | ||||
| 
 | ||||
|     Process* GetOwner() const { | ||||
|         return owner; | ||||
|     } | ||||
| 
 | ||||
|     VAddr GetSourceAddress() const { | ||||
|         return address; | ||||
|     } | ||||
| 
 | ||||
|     size_t GetSize() const { | ||||
|         return is_initialized ? size * PageSize : 0; | ||||
|     } | ||||
| 
 | ||||
|     // DEPRECATED
 | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|         return "TransferMemory"; | ||||
|     } | ||||
| 
 | ||||
|     std::string GetName() const override { | ||||
|         return GetTypeName(); | ||||
|     } | ||||
| 
 | ||||
|     HandleType GetHandleType() const override { | ||||
|         return HANDLE_TYPE; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     Process* owner{}; | ||||
|     VAddr address{}; | ||||
|     Svc::MemoryPermission owner_perm{}; | ||||
|     size_t size{}; | ||||
|     bool is_initialized{}; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
| @ -42,6 +42,7 @@ class KScheduler; | ||||
| class KSession; | ||||
| class KSharedMemory; | ||||
| class KThread; | ||||
| class KTransferMemory; | ||||
| class KWritableEvent; | ||||
| class PhysicalCore; | ||||
| class Process; | ||||
| @ -278,6 +279,8 @@ public: | ||||
|             return slab_heap_container->client_session; | ||||
|         } else if constexpr (std::is_same_v<T, KSession>) { | ||||
|             return slab_heap_container->session; | ||||
|         } else if constexpr (std::is_same_v<T, KTransferMemory>) { | ||||
|             return slab_heap_container->transfer_memory; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -320,6 +323,7 @@ private: | ||||
|         KSlabHeap<KWritableEvent> writeable_event; | ||||
|         KSlabHeap<KClientSession> client_session; | ||||
|         KSlabHeap<KSession> session; | ||||
|         KSlabHeap<KTransferMemory> transfer_memory; | ||||
|     }; | ||||
| 
 | ||||
|     std::unique_ptr<SlabHeapContainer> slab_heap_container; | ||||
|  | ||||
| @ -38,6 +38,7 @@ | ||||
| #include "core/hle/kernel/k_shared_memory.h" | ||||
| #include "core/hle/kernel/k_synchronization_object.h" | ||||
| #include "core/hle/kernel/k_thread.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/physical_core.h" | ||||
| @ -47,7 +48,6 @@ | ||||
| #include "core/hle/kernel/svc_types.h" | ||||
| #include "core/hle/kernel/svc_wrap.h" | ||||
| #include "core/hle/kernel/time_manager.h" | ||||
| #include "core/hle/kernel/transfer_memory.h" | ||||
| #include "core/hle/lock.h" | ||||
| #include "core/hle/result.h" | ||||
| #include "core/hle/service/service.h" | ||||
| @ -1868,65 +1868,68 @@ static ResultCode ResetSignal32(Core::System& system, Handle handle) { | ||||
|     return ResetSignal(system, handle); | ||||
| } | ||||
| 
 | ||||
| static constexpr bool IsValidTransferMemoryPermission(MemoryPermission perm) { | ||||
|     switch (perm) { | ||||
|     case MemoryPermission::None: | ||||
|     case MemoryPermission::Read: | ||||
|     case MemoryPermission::ReadWrite: | ||||
|         return true; | ||||
|     default: | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// Creates a TransferMemory object
 | ||||
| static ResultCode CreateTransferMemory(Core::System& system, Handle* handle, VAddr addr, u64 size, | ||||
|                                        u32 permissions) { | ||||
|     std::lock_guard lock{HLE::g_hle_lock}; | ||||
|     LOG_DEBUG(Kernel_SVC, "called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, | ||||
|               permissions); | ||||
| 
 | ||||
|     if (!Common::Is4KBAligned(addr)) { | ||||
|         LOG_ERROR(Kernel_SVC, "Address ({:016X}) is not page aligned!", addr); | ||||
|         return ResultInvalidAddress; | ||||
|     } | ||||
| 
 | ||||
|     if (!Common::Is4KBAligned(size) || size == 0) { | ||||
|         LOG_ERROR(Kernel_SVC, "Size ({:016X}) is not page aligned or equal to zero!", size); | ||||
|         return ResultInvalidAddress; | ||||
|     } | ||||
| 
 | ||||
|     if (!IsValidAddressRange(addr, size)) { | ||||
|         LOG_ERROR(Kernel_SVC, "Address and size cause overflow! (address={:016X}, size={:016X})", | ||||
|                   addr, size); | ||||
|         return ResultInvalidCurrentMemory; | ||||
|     } | ||||
| 
 | ||||
|     const auto perms{static_cast<MemoryPermission>(permissions)}; | ||||
|     if (perms > MemoryPermission::ReadWrite || perms == MemoryPermission::Write) { | ||||
|         LOG_ERROR(Kernel_SVC, "Invalid memory permissions for transfer memory! (perms={:08X})", | ||||
|                   permissions); | ||||
|         return ResultInvalidNewMemoryPermission; | ||||
|     } | ||||
| 
 | ||||
| static ResultCode CreateTransferMemory(Core::System& system, Handle* out, VAddr address, u64 size, | ||||
|                                        MemoryPermission map_perm) { | ||||
|     auto& kernel = system.Kernel(); | ||||
| 
 | ||||
|     // Validate the size.
 | ||||
|     R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress); | ||||
|     R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize); | ||||
|     R_UNLESS(size > 0, ResultInvalidSize); | ||||
|     R_UNLESS((address < address + size), ResultInvalidCurrentMemory); | ||||
| 
 | ||||
|     // Validate the permissions.
 | ||||
|     R_UNLESS(IsValidTransferMemoryPermission(map_perm), ResultInvalidNewMemoryPermission); | ||||
| 
 | ||||
|     // Get the current process and handle table.
 | ||||
|     auto& process = *kernel.CurrentProcess(); | ||||
|     auto& handle_table = process.GetHandleTable(); | ||||
| 
 | ||||
|     // Reserve a new transfer memory from the process resource limit.
 | ||||
|     KScopedResourceReservation trmem_reservation(kernel.CurrentProcess(), | ||||
|                                                  LimitableResource::TransferMemory); | ||||
|     if (!trmem_reservation.Succeeded()) { | ||||
|         LOG_ERROR(Kernel_SVC, "Could not reserve a new transfer memory"); | ||||
|         return ResultLimitReached; | ||||
|     } | ||||
|     auto transfer_mem_handle = TransferMemory::Create(kernel, system.Memory(), addr, size, | ||||
|                                                       static_cast<KMemoryPermission>(perms)); | ||||
|     R_UNLESS(trmem_reservation.Succeeded(), ResultLimitReached); | ||||
| 
 | ||||
|     if (const auto reserve_result{transfer_mem_handle->Reserve()}; reserve_result.IsError()) { | ||||
|         return reserve_result; | ||||
|     } | ||||
|     // Create the transfer memory.
 | ||||
|     KTransferMemory* trmem = KTransferMemory::Create(kernel); | ||||
|     R_UNLESS(trmem != nullptr, ResultOutOfResource); | ||||
| 
 | ||||
|     auto& handle_table = kernel.CurrentProcess()->GetHandleTable(); | ||||
|     const auto result{handle_table.Create(transfer_mem_handle.get())}; | ||||
|     if (result.Failed()) { | ||||
|         return result.Code(); | ||||
|     } | ||||
|     // Ensure the only reference is in the handle table when we're done.
 | ||||
|     SCOPE_EXIT({ trmem->Close(); }); | ||||
| 
 | ||||
|     // Ensure that the region is in range.
 | ||||
|     R_UNLESS(process.PageTable().Contains(address, size), ResultInvalidCurrentMemory); | ||||
| 
 | ||||
|     // Initialize the transfer memory.
 | ||||
|     R_TRY(trmem->Initialize(address, size, map_perm)); | ||||
| 
 | ||||
|     // Commit the reservation.
 | ||||
|     trmem_reservation.Commit(); | ||||
| 
 | ||||
|     *handle = *result; | ||||
|     // Register the transfer memory.
 | ||||
|     KTransferMemory::Register(kernel, trmem); | ||||
| 
 | ||||
|     // Add the transfer memory to the handle table.
 | ||||
|     R_TRY(handle_table.Add(out, trmem)); | ||||
| 
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| static ResultCode CreateTransferMemory32(Core::System& system, Handle* handle, u32 addr, u32 size, | ||||
|                                          u32 permissions) { | ||||
|     return CreateTransferMemory(system, handle, addr, size, permissions); | ||||
| static ResultCode CreateTransferMemory32(Core::System& system, Handle* out, u32 address, u32 size, | ||||
|                                          MemoryPermission map_perm) { | ||||
|     return CreateTransferMemory(system, out, address, size, map_perm); | ||||
| } | ||||
| 
 | ||||
| static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, s32* out_core_id, | ||||
|  | ||||
| @ -273,11 +273,12 @@ void SvcWrap64(Core::System& system) { | ||||
|     FuncReturn(system, retval); | ||||
| } | ||||
| 
 | ||||
| template <ResultCode func(Core::System&, u32*, u64, u64, u32)> | ||||
| // Used by CreateTransferMemory
 | ||||
| template <ResultCode func(Core::System&, Handle*, u64, u64, Svc::MemoryPermission)> | ||||
| void SvcWrap64(Core::System& system) { | ||||
|     u32 param_1 = 0; | ||||
|     const u32 retval = func(system, ¶m_1, Param(system, 1), Param(system, 2), | ||||
|                             static_cast<u32>(Param(system, 3))) | ||||
|                             static_cast<Svc::MemoryPermission>(Param(system, 3))) | ||||
|                            .raw; | ||||
| 
 | ||||
|     system.CurrentArmInterface().SetReg(1, param_1); | ||||
| @ -586,11 +587,12 @@ void SvcWrap32(Core::System& system) { | ||||
| } | ||||
| 
 | ||||
| // Used by CreateTransferMemory32
 | ||||
| template <ResultCode func(Core::System&, Handle*, u32, u32, u32)> | ||||
| template <ResultCode func(Core::System&, Handle*, u32, u32, Svc::MemoryPermission)> | ||||
| void SvcWrap32(Core::System& system) { | ||||
|     Handle handle = 0; | ||||
|     const u32 retval = | ||||
|         func(system, &handle, Param32(system, 1), Param32(system, 2), Param32(system, 3)).raw; | ||||
|     const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2), | ||||
|                             static_cast<Svc::MemoryPermission>(Param32(system, 3))) | ||||
|                            .raw; | ||||
|     system.CurrentArmInterface().SetReg(1, handle); | ||||
|     FuncReturn(system, retval); | ||||
| } | ||||
|  | ||||
| @ -16,10 +16,10 @@ | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/k_event.h" | ||||
| #include "core/hle/kernel/k_readable_event.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/transfer_memory.h" | ||||
| #include "core/hle/service/acc/profile_manager.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applet_ae.h" | ||||
| @ -42,6 +42,7 @@ | ||||
| #include "core/hle/service/set/set.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/memory.h" | ||||
| 
 | ||||
| namespace Service::AM { | ||||
| 
 | ||||
| @ -1248,16 +1249,16 @@ void ILibraryAppletCreator::CreateHandleStorage(Kernel::HLERequestContext& ctx) | ||||
|     } | ||||
| 
 | ||||
|     auto transfer_mem = | ||||
|         system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle); | ||||
|         system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(handle); | ||||
| 
 | ||||
|     if (transfer_mem == nullptr) { | ||||
|     if (transfer_mem.IsNull()) { | ||||
|         LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_UNKNOWN); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     const u8* const mem_begin = transfer_mem->GetPointer(); | ||||
|     const u8* const mem_begin = system.Memory().GetPointer(transfer_mem->GetSourceAddress()); | ||||
|     const u8* const mem_end = mem_begin + transfer_mem->GetSize(); | ||||
|     std::vector<u8> memory{mem_begin, mem_end}; | ||||
| 
 | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
| 
 | ||||
| namespace Kernel { | ||||
| class KernelCore; | ||||
| class TransferMemory; | ||||
| class KTransferMemory; | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| namespace Service::NVFlinger { | ||||
|  | ||||
| @ -16,14 +16,15 @@ | ||||
| #include "core/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/k_readable_event.h" | ||||
| #include "core/hle/kernel/k_shared_memory.h" | ||||
| #include "core/hle/kernel/k_transfer_memory.h" | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/transfer_memory.h" | ||||
| #include "core/hle/service/hid/errors.h" | ||||
| #include "core/hle/service/hid/hid.h" | ||||
| #include "core/hle/service/hid/irs.h" | ||||
| #include "core/hle/service/hid/xcd.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/memory.h" | ||||
| 
 | ||||
| #include "core/hle/service/hid/controllers/console_sixaxis.h" | ||||
| #include "core/hle/service/hid/controllers/controller_base.h" | ||||
| @ -1493,20 +1494,20 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { | ||||
|     ASSERT_MSG(t_mem_1_size == 0x1000, "t_mem_1_size is not 0x1000 bytes"); | ||||
|     ASSERT_MSG(t_mem_2_size == 0x7F000, "t_mem_2_size is not 0x7F000 bytes"); | ||||
| 
 | ||||
|     auto t_mem_1 = | ||||
|         system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(t_mem_1_handle); | ||||
|     auto t_mem_1 = system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>( | ||||
|         t_mem_1_handle); | ||||
| 
 | ||||
|     if (t_mem_1 == nullptr) { | ||||
|     if (t_mem_1.IsNull()) { | ||||
|         LOG_ERROR(Service_HID, "t_mem_1 is a nullptr for handle=0x{:08X}", t_mem_1_handle); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_UNKNOWN); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     auto t_mem_2 = | ||||
|         system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(t_mem_2_handle); | ||||
|     auto t_mem_2 = system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>( | ||||
|         t_mem_2_handle); | ||||
| 
 | ||||
|     if (t_mem_2 == nullptr) { | ||||
|     if (t_mem_2.IsNull()) { | ||||
|         LOG_ERROR(Service_HID, "t_mem_2 is a nullptr for handle=0x{:08X}", t_mem_2_handle); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_UNKNOWN); | ||||
| @ -1521,7 +1522,7 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { | ||||
|         .ActivateController(); | ||||
| 
 | ||||
|     applet_resource->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor) | ||||
|         .SetTransferMemoryPointer(t_mem_1->GetPointer()); | ||||
|         .SetTransferMemoryPointer(system.Memory().GetPointer(t_mem_1->GetSourceAddress())); | ||||
| 
 | ||||
|     LOG_WARNING(Service_HID, | ||||
|                 "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user