mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-22 13:02:38 +02:00
Implement heap override
This commit is contained in:
parent
3ac366528e
commit
efc7cbf653
@ -31,4 +31,6 @@
|
|||||||
#define LIBNX_BADINPUT 10
|
#define LIBNX_BADINPUT 10
|
||||||
#define LIBNX_BADREENT 11
|
#define LIBNX_BADREENT 11
|
||||||
#define LIBNX_BUFFERPRODUCER_ERROR 12
|
#define LIBNX_BUFFERPRODUCER_ERROR 12
|
||||||
|
#define LIBNX_HANDLETOOEARLY 13
|
||||||
|
#define LIBNX_HEAPALLOCFAILED 14
|
||||||
#define LIBNX_PARCEL_ERRBASE 100
|
#define LIBNX_PARCEL_ERRBASE 100
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
// Copyright 2018 plutoo
|
// Copyright 2018 plutoo
|
||||||
|
|
||||||
void envParse(void* ctx, Handle main_thread);
|
void envParse(void* ctx, Handle main_thread);
|
||||||
|
|
||||||
Handle envGetMainThreadHandle(void);
|
Handle envGetMainThreadHandle(void);
|
||||||
bool envIsNso(void);
|
bool envIsNso(void);
|
||||||
|
|
||||||
|
bool envHasHeapOverride(void);
|
||||||
|
void* envGetHeapOverrideAddr(void);
|
||||||
|
u64 envGetHeapOverrideSize(void);
|
||||||
|
@ -83,9 +83,21 @@ Handle envGetMainThreadHandle(void) {
|
|||||||
return g_mainThreadHandle;
|
return g_mainThreadHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
fatalSimple(1);
|
fatalSimple(MAKERESULT(MODULE_LIBNX, LIBNX_HANDLETOOEARLY));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool envIsNso(void) {
|
bool envIsNso(void) {
|
||||||
return g_isNso;
|
return g_isNso;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool envHasHeapOverride(void) {
|
||||||
|
return g_overrideHeapAddr != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* envGetHeapOverrideAddr(void) {
|
||||||
|
return g_overrideHeapAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 envGetHeapOverrideSize(void) {
|
||||||
|
return g_overrideHeapSize;
|
||||||
|
}
|
||||||
|
@ -7,20 +7,48 @@ void newlibSetup(void);
|
|||||||
|
|
||||||
void __system_initArgv(void);
|
void __system_initArgv(void);
|
||||||
|
|
||||||
#define INNER_HEAP_SIZE 0x200000
|
// Must be a multiple of 0x2000000.
|
||||||
__attribute__((weak)) size_t __nx_inner_heap_size = INNER_HEAP_SIZE;
|
__attribute__((weak)) size_t __nx_heap_size = 0x2000000*16;
|
||||||
__attribute__((weak)) char __nx_inner_heap[INNER_HEAP_SIZE];
|
|
||||||
__attribute__((weak)) size_t __nx_outer_heap_size = 0x2000000*16;//Must be a multiple of 0x2000000.
|
/*
|
||||||
|
There are three ways of allocating heap:
|
||||||
|
|
||||||
|
- Normal syscall:
|
||||||
|
|
||||||
|
Allocates heap using |svcSetHeapSize|. The size is provided by a weak symbol
|
||||||
|
called |__nx_heap_size|.
|
||||||
|
|
||||||
|
- Heap override:
|
||||||
|
|
||||||
|
Uses existing heap segment as provided by the homebrew loader environment
|
||||||
|
block. This happens automatically if such a setting is provided by the
|
||||||
|
homebrew environment.
|
||||||
|
|
||||||
|
- Custom override:
|
||||||
|
|
||||||
|
A program can override the weak symbol |__libnx_initheap| to setup a
|
||||||
|
different heap. In this case, the global variables |fake_heap_start|
|
||||||
|
and |fake_heap_end| needs to be set appropriately.
|
||||||
|
|
||||||
|
A custom override be used to implement an "inner heap" located in the .bss
|
||||||
|
segment of a process, for example.
|
||||||
|
*/
|
||||||
|
|
||||||
void __attribute__((weak)) __libnx_initheap(void)
|
void __attribute__((weak)) __libnx_initheap(void)
|
||||||
{
|
{
|
||||||
u64 addr;
|
void* addr;
|
||||||
Result rc = svcSetHeapSize((void**)&addr, __nx_outer_heap_size);
|
size_t size;
|
||||||
size_t size = __nx_outer_heap_size;
|
|
||||||
|
|
||||||
if (R_FAILED(rc)) {
|
if (envHasHeapOverride()) {
|
||||||
addr = (u64) &__nx_inner_heap[0];
|
addr = envGetHeapOverrideAddr();
|
||||||
size = __nx_inner_heap_size;
|
size = envGetHeapOverrideSize();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Result rc = svcSetHeapSize(&addr, __nx_heap_size);
|
||||||
|
size = __nx_heap_size;
|
||||||
|
|
||||||
|
if (R_FAILED(rc))
|
||||||
|
fatalSimple(MAKERESULT(MODULE_LIBNX, LIBNX_HEAPALLOCFAILED));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Newlib
|
// Newlib
|
||||||
|
Loading…
Reference in New Issue
Block a user