1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/* 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;
__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)));
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;
}
|