mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-24 11:46:58 -04:00

Starting in 20.0.0, the browser needs more applet memory to function, so we can't steal as much any more. Thus, we now steal 14 MB on 20.0.0+ instead of 40MB. However, since this reduces memory available for custom system modules, we are adjusting to compensate. ams.mitm's heap size has been reduced from 32MB to 12MB (recovering 20MB). In addition, fs.mitm now uses a new mechanism for stealing memory from the applet pool while romfs is being built. On net, we are compromising: * Custom sysmodules lose memory available to them. On 19.0.0/AMS 1.8.0, there was 30 MB available for custom sysmodules. Stealing 14 MB instead of 40 MB, we lose 26 MB of that. Reducing ams.mitm's usage will gain us back 20. Nintendo also appears to...use 4 extra MB, in 20.0.0, from my test homebrew. So on 20.0.0/AMS 1.9.0, there should be 20 MB available for custom sysmodules. On the bright side, on <20.0.0/AMS 1.9.0, I guess there will be 50 MB available for custom sysmodules now? * totk mods will lose the ability to...put every file in the romfs on sd card. There will be some unknown maximum filecount for totk mods. On the bright side, implementing the transient memory stealing should improve compatibility for some mods which strictly add files?
58 lines
2.4 KiB
C++
58 lines
2.4 KiB
C++
/*
|
|
* Copyright (c) Atmosphère-NX
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <stratosphere.hpp>
|
|
#include "memlet_service.hpp"
|
|
|
|
namespace ams::memlet {
|
|
|
|
Result Service::CreateAppletSharedMemory(sf::Out<u64> out_size, sf::OutMoveHandle out_handle, u64 desired_size) {
|
|
/* Create a handle to set the output to when done. */
|
|
os::NativeHandle handle = os::InvalidNativeHandle;
|
|
ON_SCOPE_EXIT { out_handle.SetValue(handle, true); };
|
|
|
|
/* Check that the requested size has megabyte alignment and isn't too big. */
|
|
R_UNLESS(util::IsAligned(desired_size, 1_MB), os::ResultInvalidParameter());
|
|
R_UNLESS(desired_size <= 128_MB, os::ResultInvalidParameter());
|
|
|
|
/* Try to create a shared memory of the desired size, giving up 1 MB each iteration. */
|
|
os::SharedMemoryType shmem = {};
|
|
while (true) {
|
|
/* If we have zero desired-size left, we've failed. */
|
|
R_UNLESS(desired_size > 0, os::ResultOutOfMemory());
|
|
|
|
/* Try to create a shared memory. */
|
|
if (R_FAILED(os::CreateSharedMemory(std::addressof(shmem), desired_size, os::MemoryPermission_ReadWrite, os::MemoryPermission_ReadWrite))) {
|
|
/* We failed, so decrease the size to see if that works. */
|
|
desired_size -= 1_MB;
|
|
continue;
|
|
}
|
|
|
|
/* We successfully created the shared memory. */
|
|
break;
|
|
}
|
|
|
|
/* Get the native handle for the shared memory we created. */
|
|
handle = os::GetSharedMemoryHandle(std::addressof(shmem));
|
|
|
|
/* HACK: Clear the shared memory object, since we've stolen its handle, and there's no "correct" way to detach. */
|
|
shmem = {};
|
|
|
|
/* We successfully created a shared memory! */
|
|
*out_size = desired_size;
|
|
R_SUCCEED();
|
|
}
|
|
|
|
}
|