summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-11-20 08:24:11 -0800
committerGravatar GitHub2018-11-20 08:24:11 -0800
commitb6d2c64f4dcb01f1ffc99f9a057910ec65c6a401 (patch)
treeb75fde22327ac851821d58078614e62cc1c29916 /src/core/hle/kernel/svc.cpp
parentMerge pull request #1739 from lioncash/lm (diff)
parentsoftware_keyboard: Fix erroneous extra PushNormalData (diff)
downloadyuzu-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.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 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
1185static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { 1185static 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