diff options
| author | 2018-11-20 08:24:11 -0800 | |
|---|---|---|
| committer | 2018-11-20 08:24:11 -0800 | |
| commit | b6d2c64f4dcb01f1ffc99f9a057910ec65c6a401 (patch) | |
| tree | b75fde22327ac851821d58078614e62cc1c29916 /src/core/hle/kernel/svc.cpp | |
| parent | Merge pull request #1739 from lioncash/lm (diff) | |
| parent | software_keyboard: Fix erroneous extra PushNormalData (diff) | |
| download | yuzu-b6d2c64f4dcb01f1ffc99f9a057910ec65c6a401.tar.gz yuzu-b6d2c64f4dcb01f1ffc99f9a057910ec65c6a401.tar.xz yuzu-b6d2c64f4dcb01f1ffc99f9a057910ec65c6a401.zip | |
Merge pull request #1667 from DarkLordZach/swkbd
am: Implement HLE software keyboard applet
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 9904605cd..51c367de7 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1183,9 +1183,39 @@ static ResultCode ResetSignal(Handle handle) { | |||
| 1183 | 1183 | ||
| 1184 | /// Creates a TransferMemory object | 1184 | /// Creates a TransferMemory object |
| 1185 | static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { | 1185 | static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { |
| 1186 | LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, | 1186 | LOG_DEBUG(Kernel_SVC, "called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, |
| 1187 | permissions); | 1187 | permissions); |
| 1188 | *handle = 0; | 1188 | |
| 1189 | if (!Common::Is4KBAligned(addr)) { | ||
| 1190 | LOG_ERROR(Kernel_SVC, "Address ({:016X}) is not page aligned!", addr); | ||
| 1191 | return ERR_INVALID_ADDRESS; | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | if (!Common::Is4KBAligned(size) || size == 0) { | ||
| 1195 | LOG_ERROR(Kernel_SVC, "Size ({:016X}) is not page aligned or equal to zero!", size); | ||
| 1196 | return ERR_INVALID_ADDRESS; | ||
| 1197 | } | ||
| 1198 | |||
| 1199 | if (!IsValidAddressRange(addr, size)) { | ||
| 1200 | LOG_ERROR(Kernel_SVC, "Address and size cause overflow! (address={:016X}, size={:016X})", | ||
| 1201 | addr, size); | ||
| 1202 | return ERR_INVALID_ADDRESS_STATE; | ||
| 1203 | } | ||
| 1204 | |||
| 1205 | const auto perms = static_cast<MemoryPermission>(permissions); | ||
| 1206 | if (perms != MemoryPermission::None && perms != MemoryPermission::Read && | ||
| 1207 | perms != MemoryPermission::ReadWrite) { | ||
| 1208 | LOG_ERROR(Kernel_SVC, "Invalid memory permissions for transfer memory! (perms={:08X})", | ||
| 1209 | permissions); | ||
| 1210 | return ERR_INVALID_MEMORY_PERMISSIONS; | ||
| 1211 | } | ||
| 1212 | |||
| 1213 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 1214 | auto& handle_table = Core::CurrentProcess()->GetHandleTable(); | ||
| 1215 | const auto shared_mem_handle = SharedMemory::Create( | ||
| 1216 | kernel, handle_table.Get<Process>(CurrentProcess), size, perms, perms, addr); | ||
| 1217 | |||
| 1218 | CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle)); | ||
| 1189 | return RESULT_SUCCESS; | 1219 | return RESULT_SUCCESS; |
| 1190 | } | 1220 | } |
| 1191 | 1221 | ||