summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-11-09 17:02:50 -0500
committerGravatar Zach Hilman2018-11-18 10:53:47 -0500
commit7901de2b75bf527790c3c24e6667b275e2ebeb2b (patch)
treef12da044a1763a561de7b0c9c3117765eae36da1
parentMerge pull request #1722 from MysticExile/enable-applictation-crash-report (diff)
downloadyuzu-7901de2b75bf527790c3c24e6667b275e2ebeb2b.tar.gz
yuzu-7901de2b75bf527790c3c24e6667b275e2ebeb2b.tar.xz
yuzu-7901de2b75bf527790c3c24e6667b275e2ebeb2b.zip
svc: Implement svcCreateTransferMemory
Seems to be used and created identically to SharedMemory, so just reuse that.
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/svc.cpp36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 2e7c9d094..20af65ee7 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1194,9 +1194,39 @@ static ResultCode ResetSignal(Handle handle) {
1194 1194
1195/// Creates a TransferMemory object 1195/// Creates a TransferMemory object
1196static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { 1196static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) {
1197 LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, 1197 LOG_DEBUG(Kernel_SVC, "called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size,
1198 permissions); 1198 permissions);
1199 *handle = 0; 1199
1200 if (!Common::Is4KBAligned(addr)) {
1201 LOG_ERROR(Kernel_SVC, "Address ({:016X}) is not page aligned!", addr);
1202 return ERR_INVALID_ADDRESS;
1203 }
1204
1205 if (!Common::Is4KBAligned(size) || size == 0) {
1206 LOG_ERROR(Kernel_SVC, "Size ({:016X}) is not page aligned or equal to zero!", size);
1207 return ERR_INVALID_ADDRESS;
1208 }
1209
1210 if (addr + size <= addr) {
1211 LOG_ERROR(Kernel_SVC, "Address and size cause overflow! (address={:016X}, size={:016X})",
1212 addr, size);
1213 return ERR_INVALID_ADDRESS_STATE;
1214 }
1215
1216 if (permissions > static_cast<u32>(MemoryPermission::ReadWrite) ||
1217 permissions == static_cast<u32>(MemoryPermission::Write)) {
1218 LOG_ERROR(Kernel_SVC, "Invalid memory permissions for transfer memory! (perms={:08X})",
1219 permissions);
1220 return ERR_INVALID_MEMORY_PERMISSIONS;
1221 }
1222
1223 auto& kernel = Core::System::GetInstance().Kernel();
1224 auto& handle_table = Core::CurrentProcess()->GetHandleTable();
1225 const auto perms = static_cast<MemoryPermission>(permissions);
1226 const auto shared_mem_handle = SharedMemory::Create(
1227 kernel, handle_table.Get<Process>(CurrentProcess), size, perms, perms, addr);
1228
1229 CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
1200 return RESULT_SUCCESS; 1230 return RESULT_SUCCESS;
1201} 1231}
1202 1232