@ -935,12 +935,28 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss
LOG_TRACE ( Kernel_SVC , " called, size=0x{:X}, localPerms=0x{:08X}, remotePerms=0x{:08X} " , size ,
LOG_TRACE ( Kernel_SVC , " called, size=0x{:X}, localPerms=0x{:08X}, remotePerms=0x{:08X} " , size ,
local_permissions , remote_permissions ) ;
local_permissions , remote_permissions ) ;
// Size must be a multiple of 4KB and be less than or equal to
// approx. 8 GB (actually (1GB - 512B) * 8)
if ( size = = 0 | | ( size & 0xFFFFFFFE00000FFF ) ! = 0 ) {
return ERR_INVALID_SIZE ;
}
const auto local_perms = static_cast < MemoryPermission > ( local_permissions ) ;
if ( local_perms ! = MemoryPermission : : Read & & local_perms ! = MemoryPermission : : ReadWrite ) {
return ERR_INVALID_MEMORY_PERMISSIONS ;
}
const auto remote_perms = static_cast < MemoryPermission > ( remote_permissions ) ;
if ( remote_perms ! = MemoryPermission : : Read & & remote_perms ! = MemoryPermission : : ReadWrite & &
remote_perms ! = MemoryPermission : : DontCare ) {
return ERR_INVALID_MEMORY_PERMISSIONS ;
}
auto & kernel = Core : : System : : GetInstance ( ) . Kernel ( ) ;
auto & kernel = Core : : System : : GetInstance ( ) . Kernel ( ) ;
auto & handle_table = kernel . HandleTable ( ) ;
auto & handle_table = kernel . HandleTable ( ) ;
auto shared_mem_handle =
auto shared_mem_handle =
SharedMemory : : Create ( kernel , handle_table . Get < Process > ( KernelHandle : : CurrentProcess ) , size ,
SharedMemory : : Create ( kernel , handle_table . Get < Process > ( KernelHandle : : CurrentProcess ) , size ,
static_cast < MemoryPermission > ( local_permissions ) ,
local_perms , remote_perms ) ;
static_cast < MemoryPermission > ( remote_permissions ) ) ;
CASCADE_RESULT ( * handle , handle_table . Create ( shared_mem_handle ) ) ;
CASCADE_RESULT ( * handle , handle_table . Create ( shared_mem_handle ) ) ;
return RESULT_SUCCESS ;
return RESULT_SUCCESS ;