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
|
#include "ovlmgr.h"
#include "attributes.h"
#include "fault.h"
#include "loadfragment.h"
#include "libc64/malloc.h"
#include "m_malloc.h"
#include "libc64/sprintf.h"
#include "m_std_dma.h"
void* ovlmgr_Malloc(size_t size) {
void* ptr;
if (zelda_MallocIsInitalized()) {
ptr = zelda_malloc_r(size);
} else {
ptr = malloc_r(size);
}
return ptr;
}
void ovlmgr_Free(void* ptr) {
if (zelda_MallocIsInitalized()) {
zelda_free(ptr);
} else {
free(ptr);
}
}
void ovlmgr_LoadImpl(RomOffset vromStart, UNUSED RomOffset vromEndUnused, void* vramStart, void* vramEnd,
void* allocatedRamAddr, struct OverlayRelocationSection* ovl, size_t size) {
RomOffset vromEnd;
RomOffset ovlStart;
RomOffset ovlEnd;
size_t ovlSize;
OverlayRelocationSection* ovlRelocs;
char ovlSizeStr[80];
DmaMgr_GetOvlOffsets(vromStart, &vromEnd, &ovlStart, &ovlEnd);
ovlSize = (uintptr_t)ovlEnd - (uintptr_t)ovlStart;
if ((ovl == NULL) || (size < ovlSize)) {
ovlRelocs = ovlmgr_Malloc(ovlSize);
} else {
ovlRelocs = ovl;
}
if (ovlRelocs == NULL) {
sprintf(ovlSizeStr, "%ld", ovlSize);
fault_AddHungupAndCrashImpl("ovlmgr: Out of Memory", ovlSizeStr);
}
Overlay_Load(vromStart, vromEnd, ovlStart, ovlEnd, vramStart, vramEnd, allocatedRamAddr, ovlRelocs);
if (size < ovlSize) {
ovlmgr_Free(ovlRelocs);
}
}
void ovlmgr_Load(RomOffset vromStart, RomOffset vromEnd, void* vramStart, void* vramEnd, void* allocatedRamAddr) {
ovlmgr_LoadImpl(vromStart, vromEnd, vramStart, vramEnd, allocatedRamAddr, NULL, 0);
}
|