[Scummvm-git-logs] scummvm master -> bf0d65c84d8a3c50159c55b8ac5c6eed12c6a4a2
ccawley2011
noreply at scummvm.org
Sat Nov 23 22:17:57 UTC 2024
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
c82a71314c BACKENDS: 3DS: Allocate linear memory conditionally based on system model
bf0d65c84d BACKENDS: 3DS: Remove unused code
Commit: c82a71314ce47ef4ca0e8698d1c1775b61dd43bd
https://github.com/scummvm/scummvm/commit/c82a71314ce47ef4ca0e8698d1c1775b61dd43bd
Author: Michael Ball (ballm4788 at gmail.com)
Date: 2024-11-23T22:17:54Z
Commit Message:
BACKENDS: 3DS: Allocate linear memory conditionally based on system model
The New 3DS requires more linear memory to launch the app than the Old 3DS does; this was causing the 3DS port to instantly crash on New 3DS models.
This commit fixes that while allowing for future functionality coming soon(TM).
Changed paths:
A backends/platform/3ds/allocHeapsOverride.cpp
backends/platform/3ds/main.cpp
backends/platform/3ds/module.mk
diff --git a/backends/platform/3ds/allocHeapsOverride.cpp b/backends/platform/3ds/allocHeapsOverride.cpp
new file mode 100644
index 00000000000..83fab1d61ef
--- /dev/null
+++ b/backends/platform/3ds/allocHeapsOverride.cpp
@@ -0,0 +1,107 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that 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/>.
+ *
+ */
+
+// This file largely reuses code from libctru
+// https://github.com/devkitPro/libctru/blob/33a570b1c335cc38e50b7fef6bf4ed840bbd4ab2/libctru/source/system/allocateHeaps.c
+#include <3ds.h>
+
+#define HEAP_SPLIT_SIZE_CAP (24 << 20) // 24MB
+#define LINEAR_HEAP_SIZE_CAP (32 << 20) // 32MB
+
+// Hack to get the hardware's FCRAM layout ID. It just werks.
+// Layouts 0 through 5 are used exclusively in Old 3DS systems.
+// Layouts 6 through 8 are used exclusively in New 3DS systems.
+#define APPMEMTYPE (*(u32*)0x1FF80030)
+
+extern "C" void __system_allocateHeaps(void) {
+ extern char* fake_heap_start;
+ extern char* fake_heap_end;
+ extern u32 __ctru_heap;
+ extern u32 __ctru_linear_heap;
+ extern u32 __ctru_heap_size;
+ extern u32 __ctru_linear_heap_size;
+ Result rc;
+
+ // Retrieve handle to the resource limit object for our process
+ Handle reslimit = 0;
+ rc = svcGetResourceLimit(&reslimit, CUR_PROCESS_HANDLE);
+ if (R_FAILED(rc))
+ svcBreak(USERBREAK_PANIC);
+
+ // Retrieve information about total/used memory
+ s64 maxCommit = 0, currentCommit = 0;
+ ResourceLimitType reslimitType = RESLIMIT_COMMIT;
+ svcGetResourceLimitLimitValues(&maxCommit, reslimit, &reslimitType, 1); // for APPLICATION this is equal to APPMEMALLOC at all times
+ svcGetResourceLimitCurrentValues(¤tCommit, reslimit, &reslimitType, 1);
+ svcCloseHandle(reslimit);
+
+ // Calculate how much remaining free memory is available
+ u32 remaining = (u32)(maxCommit - currentCommit) &~ 0xFFF;
+
+ __ctru_heap_size = 0;
+ // New 3DS needs more linear memory than Old 3DS to boot up ScummVM; app instantly crashes otherwise.
+ // 0x00A00000 bytes = 10 MiB, for Old 3DS
+ // 0x01400000 bytes = 20 MiB, for New 3DS
+ __ctru_linear_heap_size = APPMEMTYPE < 6 ? 0x00A00000 : 0x01400000;
+
+ if (__ctru_heap_size + __ctru_linear_heap_size > remaining)
+ svcBreak(USERBREAK_PANIC);
+
+ if (__ctru_heap_size == 0 && __ctru_linear_heap_size == 0) {
+ // Split available memory equally between linear and application heaps (with rounding in favor of the latter)
+ __ctru_linear_heap_size = (remaining / 2) & ~0xFFF;
+ __ctru_heap_size = remaining - __ctru_linear_heap_size;
+
+ // If the application heap size is bigger than the cap, prefer to grow linear heap instead
+ if (__ctru_heap_size > HEAP_SPLIT_SIZE_CAP) {
+ __ctru_heap_size = HEAP_SPLIT_SIZE_CAP;
+ __ctru_linear_heap_size = remaining - __ctru_heap_size;
+
+ // However if the linear heap size is bigger than the cap, prefer to grow application heap
+ if (__ctru_linear_heap_size > LINEAR_HEAP_SIZE_CAP) {
+ __ctru_linear_heap_size = LINEAR_HEAP_SIZE_CAP;
+ __ctru_heap_size = remaining - __ctru_linear_heap_size;
+ }
+ }
+ } else if (__ctru_heap_size == 0) {
+ __ctru_heap_size = remaining - __ctru_linear_heap_size;
+ } else if (__ctru_linear_heap_size == 0) {
+ __ctru_linear_heap_size = remaining - __ctru_heap_size;
+ }
+
+ // Allocate the application heap
+ rc = svcControlMemory(&__ctru_heap, OS_HEAP_AREA_BEGIN, 0x0, __ctru_heap_size, MEMOP_ALLOC, static_cast<MemPerm>(static_cast<int>(MEMPERM_READ) | static_cast<int>(MEMPERM_WRITE)));
+ if (R_FAILED(rc))
+ svcBreak(USERBREAK_PANIC);
+
+ // Allocate the linear heap
+ rc = svcControlMemory(&__ctru_linear_heap, 0x0, 0x0, __ctru_linear_heap_size, MEMOP_ALLOC_LINEAR, static_cast<MemPerm>(static_cast<int>(MEMPERM_READ) | static_cast<int>(MEMPERM_WRITE)));
+ if (R_FAILED(rc))
+ svcBreak(USERBREAK_PANIC);
+
+ // Mappable allocator init
+ mappableInit(OS_MAP_AREA_BEGIN, OS_MAP_AREA_END);
+
+ // Set up newlib heap
+ fake_heap_start = (char*)__ctru_heap;
+ fake_heap_end = fake_heap_start + __ctru_heap_size;
+
+}
diff --git a/backends/platform/3ds/main.cpp b/backends/platform/3ds/main.cpp
index 033d8fac035..159bc01eb50 100644
--- a/backends/platform/3ds/main.cpp
+++ b/backends/platform/3ds/main.cpp
@@ -33,8 +33,7 @@ enum {
u32 __stacksize__ = 64 * 1024;
// Set the size of the linear heap to allow a larger application heap.
-u32 __ctru_heap_size = 0;
-u32 __ctru_linear_heap_size = 10 * 1024 * 1024;
+// We do this in backends/platform/3ds/allocHeapsOverride.cpp
int main(int argc, char *argv[]) {
// Initialize basic libctru stuff
diff --git a/backends/platform/3ds/module.mk b/backends/platform/3ds/module.mk
index ee08fa66ec7..8662cac5135 100644
--- a/backends/platform/3ds/module.mk
+++ b/backends/platform/3ds/module.mk
@@ -2,6 +2,7 @@ MODULE := backends/platform/3ds
MODULE_OBJS := \
main.o \
+ allocHeapsOverride.o \
shader.shbin.o \
sprite.o \
options.o \
Commit: bf0d65c84d8a3c50159c55b8ac5c6eed12c6a4a2
https://github.com/scummvm/scummvm/commit/bf0d65c84d8a3c50159c55b8ac5c6eed12c6a4a2
Author: Michael Ball (ballm4788 at gmail.com)
Date: 2024-11-23T22:17:54Z
Commit Message:
BACKENDS: 3DS: Remove unused code
Changed paths:
backends/platform/3ds/allocHeapsOverride.cpp
diff --git a/backends/platform/3ds/allocHeapsOverride.cpp b/backends/platform/3ds/allocHeapsOverride.cpp
index 83fab1d61ef..49e72a74762 100644
--- a/backends/platform/3ds/allocHeapsOverride.cpp
+++ b/backends/platform/3ds/allocHeapsOverride.cpp
@@ -61,31 +61,7 @@ extern "C" void __system_allocateHeaps(void) {
// 0x00A00000 bytes = 10 MiB, for Old 3DS
// 0x01400000 bytes = 20 MiB, for New 3DS
__ctru_linear_heap_size = APPMEMTYPE < 6 ? 0x00A00000 : 0x01400000;
-
- if (__ctru_heap_size + __ctru_linear_heap_size > remaining)
- svcBreak(USERBREAK_PANIC);
-
- if (__ctru_heap_size == 0 && __ctru_linear_heap_size == 0) {
- // Split available memory equally between linear and application heaps (with rounding in favor of the latter)
- __ctru_linear_heap_size = (remaining / 2) & ~0xFFF;
- __ctru_heap_size = remaining - __ctru_linear_heap_size;
-
- // If the application heap size is bigger than the cap, prefer to grow linear heap instead
- if (__ctru_heap_size > HEAP_SPLIT_SIZE_CAP) {
- __ctru_heap_size = HEAP_SPLIT_SIZE_CAP;
- __ctru_linear_heap_size = remaining - __ctru_heap_size;
-
- // However if the linear heap size is bigger than the cap, prefer to grow application heap
- if (__ctru_linear_heap_size > LINEAR_HEAP_SIZE_CAP) {
- __ctru_linear_heap_size = LINEAR_HEAP_SIZE_CAP;
- __ctru_heap_size = remaining - __ctru_linear_heap_size;
- }
- }
- } else if (__ctru_heap_size == 0) {
- __ctru_heap_size = remaining - __ctru_linear_heap_size;
- } else if (__ctru_linear_heap_size == 0) {
- __ctru_linear_heap_size = remaining - __ctru_heap_size;
- }
+ __ctru_heap_size = remaining - __ctru_linear_heap_size;
// Allocate the application heap
rc = svcControlMemory(&__ctru_heap, OS_HEAP_AREA_BEGIN, 0x0, __ctru_heap_size, MEMOP_ALLOC, static_cast<MemPerm>(static_cast<int>(MEMPERM_READ) | static_cast<int>(MEMPERM_WRITE)));
More information about the Scummvm-git-logs
mailing list