mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Reworked svcs slightly, improved error messages in AM and fsp_srv
This commit is contained in:
		
							parent
							
								
									dace6087d6
								
							
						
					
					
						commit
						f271316822
					
				@ -63,6 +63,8 @@ bool IsInsideNewMapRegion(const VMManager& vm, VAddr address, u64 size) {
 | 
				
			|||||||
                                vm.GetNewMapRegionEndAddress());
 | 
					                                vm.GetNewMapRegionEndAddress());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const u64 SZ_8GB = 0x200000000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Helper function that performs the common sanity checks for svcMapMemory
 | 
					// Helper function that performs the common sanity checks for svcMapMemory
 | 
				
			||||||
// and svcUnmapMemory. This is doable, as both functions perform their sanitizing
 | 
					// and svcUnmapMemory. This is doable, as both functions perform their sanitizing
 | 
				
			||||||
// in the same order.
 | 
					// in the same order.
 | 
				
			||||||
@ -75,6 +77,7 @@ ResultCode MapUnmapMemorySanityChecks(const VMManager& vm_manager, VAddr dst_add
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (!Common::Is4KBAligned(src_addr)) {
 | 
					    if (!Common::Is4KBAligned(src_addr)) {
 | 
				
			||||||
        LOG_ERROR(Kernel_SVC, "Source address is not aligned to 4KB, 0x{:016X}", src_addr);
 | 
					        LOG_ERROR(Kernel_SVC, "Source address is not aligned to 4KB, 0x{:016X}", src_addr);
 | 
				
			||||||
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (size == 0) {
 | 
					    if (size == 0) {
 | 
				
			||||||
@ -141,12 +144,15 @@ ResultCode MapUnmapMemorySanityChecks(const VMManager& vm_manager, VAddr dst_add
 | 
				
			|||||||
static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) {
 | 
					static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) {
 | 
				
			||||||
    LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", heap_size);
 | 
					    LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", heap_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Size must be a multiple of 0x200000 (2MB) and be equal to or less than 4GB.
 | 
					    // Size must be a multiple of 0x200000 (2MB) and be equal to or less than 8GB.
 | 
				
			||||||
    if ((heap_size & 0xFFFFFFFE001FFFFF) != 0) {
 | 
					    if ((heap_size & 0x1FFFFF) != 0) {
 | 
				
			||||||
        LOG_ERROR(
 | 
					        LOG_ERROR(Kernel_SVC, "The heap size is not a multiple of 2MB, heap_size=0x{:016X}",
 | 
				
			||||||
            Kernel_SVC,
 | 
					                  heap_size);
 | 
				
			||||||
            "The heap size is not a multiple of 2mb or is greater than 4GB, heap_size=0x{:016X}",
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
            heap_size);
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (heap_size >= SZ_8GB) {
 | 
				
			||||||
 | 
					        LOG_ERROR(Kernel_SVC, "The heap size is not less than 8GB, heap_size=0x{:016X}", heap_size);
 | 
				
			||||||
        return ERR_INVALID_SIZE;
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1438,15 +1444,17 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss
 | 
				
			|||||||
                                     u32 remote_permissions) {
 | 
					                                     u32 remote_permissions) {
 | 
				
			||||||
    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) {
 | 
					    if (size == 0) {
 | 
				
			||||||
        LOG_ERROR(Kernel_SVC, "Size is 0");
 | 
					        LOG_ERROR(Kernel_SVC, "Size is 0");
 | 
				
			||||||
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if ((size & 0xFFFFFFFE00000FFF) != 0) {
 | 
					    if (!Common::Is4KBAligned(size)) {
 | 
				
			||||||
        LOG_ERROR(Kernel_SVC, "Size is not a multiple of 4KB or is greater than 8GB, size={:016X}",
 | 
					        LOG_ERROR(Kernel_SVC, "Size is not aligned to 4KB, 0x{:016X}", size);
 | 
				
			||||||
                  size);
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (size >= SZ_8GB) {
 | 
				
			||||||
 | 
					        LOG_ERROR(Kernel_SVC, "Size is not less than 8GB, 0x{:016X}", size);
 | 
				
			||||||
        return ERR_INVALID_SIZE;
 | 
					        return ERR_INVALID_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -616,7 +616,8 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        const auto storage = applet->GetBroker().PopNormalDataToGame();
 | 
					        const auto storage = applet->GetBroker().PopNormalDataToGame();
 | 
				
			||||||
        if (storage == nullptr) {
 | 
					        if (storage == nullptr) {
 | 
				
			||||||
            LOG_ERROR(Service_AM, "storage is a nullptr. There is no data in the current channel");
 | 
					            LOG_ERROR(Service_AM,
 | 
				
			||||||
 | 
					                      "storage is a nullptr. There is no data in the current normal channel");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            rb.Push(ERR_NO_DATA_IN_CHANNEL);
 | 
					            rb.Push(ERR_NO_DATA_IN_CHANNEL);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@ -647,7 +648,8 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        const auto storage = applet->GetBroker().PopInteractiveDataToGame();
 | 
					        const auto storage = applet->GetBroker().PopInteractiveDataToGame();
 | 
				
			||||||
        if (storage == nullptr) {
 | 
					        if (storage == nullptr) {
 | 
				
			||||||
            LOG_ERROR(Service_AM, "storage is a nullptr. There is no data in the current channel");
 | 
					            LOG_ERROR(Service_AM,
 | 
				
			||||||
 | 
					                      "storage is a nullptr. There is no data in the current interactive channel");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            rb.Push(ERR_NO_DATA_IN_CHANNEL);
 | 
					            rb.Push(ERR_NO_DATA_IN_CHANNEL);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
				
			|||||||
@ -62,13 +62,13 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Error checking
 | 
					        // Error checking
 | 
				
			||||||
        if (length < 0) {
 | 
					        if (length < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid length provided");
 | 
					            LOG_ERROR(Service_FS, "Length is less than 0, length={}", length);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
					            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (offset < 0) {
 | 
					        if (offset < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid offset provided");
 | 
					            LOG_ERROR(Service_FS, "Offset is less than 0, offset={}", offset);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
					            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@ -109,13 +109,13 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Error checking
 | 
					        // Error checking
 | 
				
			||||||
        if (length < 0) {
 | 
					        if (length < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid length provided");
 | 
					            LOG_ERROR(Service_FS, "Length is less than 0, length={}", length);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
					            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (offset < 0) {
 | 
					        if (offset < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid offset provided");
 | 
					            LOG_ERROR(Service_FS, "Offset is less than 0, offset={}", offset);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
					            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@ -142,13 +142,13 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Error checking
 | 
					        // Error checking
 | 
				
			||||||
        if (length < 0) {
 | 
					        if (length < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid length provided");
 | 
					            LOG_ERROR(Service_FS, "Length is less than 0, length={}", length);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
					            rb.Push(FileSys::ERROR_INVALID_SIZE);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (offset < 0) {
 | 
					        if (offset < 0) {
 | 
				
			||||||
            LOG_ERROR(Service_FS, "Invalid offset provided");
 | 
					            LOG_ERROR(Service_FS, "Offset is less than 0, offset={}", offset);
 | 
				
			||||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
					            IPC::ResponseBuilder rb{ctx, 2};
 | 
				
			||||||
            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
					            rb.Push(FileSys::ERROR_INVALID_OFFSET);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user