svc: Implement svcCreateTransferMemory
Seems to be used and created identically to SharedMemory, so just reuse that.
This commit is contained in:
		| @@ -1194,9 +1194,39 @@ static ResultCode ResetSignal(Handle handle) { | ||||
|  | ||||
| /// Creates a TransferMemory object | ||||
| static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { | ||||
|     LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, | ||||
|                 permissions); | ||||
|     *handle = 0; | ||||
|     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 ERR_INVALID_ADDRESS; | ||||
|     } | ||||
|  | ||||
|     if (!Common::Is4KBAligned(size) || size == 0) { | ||||
|         LOG_ERROR(Kernel_SVC, "Size ({:016X}) is not page aligned or equal to zero!", size); | ||||
|         return ERR_INVALID_ADDRESS; | ||||
|     } | ||||
|  | ||||
|     if (addr + size <= addr) { | ||||
|         LOG_ERROR(Kernel_SVC, "Address and size cause overflow! (address={:016X}, size={:016X})", | ||||
|                   addr, size); | ||||
|         return ERR_INVALID_ADDRESS_STATE; | ||||
|     } | ||||
|  | ||||
|     if (permissions > static_cast<u32>(MemoryPermission::ReadWrite) || | ||||
|         permissions == static_cast<u32>(MemoryPermission::Write)) { | ||||
|         LOG_ERROR(Kernel_SVC, "Invalid memory permissions for transfer memory! (perms={:08X})", | ||||
|                   permissions); | ||||
|         return ERR_INVALID_MEMORY_PERMISSIONS; | ||||
|     } | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& handle_table = Core::CurrentProcess()->GetHandleTable(); | ||||
|     const auto perms = static_cast<MemoryPermission>(permissions); | ||||
|     const auto shared_mem_handle = SharedMemory::Create( | ||||
|         kernel, handle_table.Get<Process>(CurrentProcess), size, perms, perms, addr); | ||||
|  | ||||
|     CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle)); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zach Hilman
					Zach Hilman