56#define ALIGN_MASK ((2 * sizeof(void *)) - 1)
57#define ALIGN_TO(x) (((uintptr_t)(x) + ALIGN_MASK) & ~ALIGN_MASK)
92_Static_assert(
sizeof(
empty_block) == (2 *
sizeof(
void *)),
"empty_block is of the wrong size");
94_Static_assert(
sizeof(
allocated_block) == (2 *
sizeof(
void *)),
"allocated_block is of the wrong size");
108} s_heap_metadata = {NULL, NULL, NULL, NULL, NULL};
111#define head s_heap_metadata.head
112#define bottom s_heap_metadata.bottom
113#define top s_heap_metadata.top
114#define maximum_heap_end s_heap_metadata.maximum_heap_end
115#define marker s_heap_metadata.marker
120#define dprintf ramsyscall_printf
124 }
else if (block == &
marker) {
134 size_t hypothetical_size) {
135 if (first == top_block) {
138 ramsyscall_printf(
"Integrity check: checking sublist from %p to %p, size_start = %u, hypothetical_size: %u\n",
139 first, top_block, size_start, hypothetical_size);
141 size_t size = size_start;
142 while (curr < top_block) {
144 ramsyscall_printf(
"Integrity check: checking allocated block at %p (size: %u) - current total = %u\n", curr,
146 if (curr->
size == 0) {
156 if (curr->
size % (
sizeof(
void *) * 2) != 0) {
161 if (
size > hypothetical_size) {
168 if (
size != hypothetical_size) {
186 if (curr->
next == NULL) {
192 if (curr->
next == curr) {
198 if (curr->
size == 0) {
210 if ((uintptr_t)curr->
next %
sizeof(
void *) != 0) {
216 if (curr->
size % (
sizeof(
void *) * 2) != 0) {
230 size_t start_size = curr->
size;
232 if (check_subintegrity(
ptr, last, start_size, hypothetical))
return;
239#define print_block(x)
240#define check_integrity()
249 dprintf(
"libc_malloc(%u)\n", size_);
273 if (pcsx_present()) {
274 pcsx_registerHeapMetadata(&s_heap_metadata);
282 size_t curr_size = 0;
283 while ((curr_size !=
size) && (curr != &
marker)) {
284 dprintf(
"libc_malloc: curr: ");
286 curr_size = curr->
size;
288 if (curr_size >=
size) {
290 if ((best_fit == NULL) || (curr_size < best_fit->
size)) {
292 best_fit_prev = prev;
293 dprintf(
"libc_malloc: new best fit: ");
303 if (best_fit == NULL) {
304 dprintf(
"libc_malloc(%u) failed\n", size_);
308 size_t best_fit_size = best_fit->
size;
325 if (best_fit_size ==
size) {
327 if (best_fit_prev == NULL) {
330 best_fit_prev->
next = best_fit->
next;
336 new_block->
size = best_fit_size -
size;
337 if (best_fit_prev == NULL) {
340 best_fit_prev->
next = new_block;
345 void *end = (
void *)((
char *)
ptr +
size);
352 dprintf(
"libc_malloc(%u) -> %p\n", size_,
ptr);
358 dprintf(
"libc_free(%p)\n", ptr_);
394 if (((
char *)block +
size) == (
char *)
head) {
439 if (((
char *)curr + curr->
size) == (
char *)block) {
443 if (((
char *)curr + curr->
size) == (
char *)next) {
444 curr->
size += next->size;
448 }
else if (((
char *)block +
size) == (
char *)next) {
468 if (((
char *)curr + curr->
size) == (
char *)block) {
482 dprintf(
"libc_realloc(%p, %u)\n", ptr_, size_);
485 dprintf(
"libc_realloc(%p, %u) -> malloc\n", ptr_, size_);
491 dprintf(
"libc_realloc(%p, %u) -> free\n", ptr_, size_);
497 dprintf(
"libc_realloc(%p, %u) -> %u\n", ptr_, size_,
size);
500 size_t old_size = (--block)->
size;
503 if (
size == old_size) {
504 dprintf(
"libc_realloc(%p, %u) -> same\n", ptr_, size_);
513 if (
size < old_size) {
519 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, ptr_);
531 if (
size < old_size) {
546 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, ptr_);
554 if (((
char *)block + old_size) == (
char *)
head) {
555 size_t delta =
size - old_size;
556 if (
head->size >= delta) {
559 if (
head->size == delta) {
565 new_block->
size =
head->size - delta;
569 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, ptr_);
580 while ((next = curr->
next) != NULL) {
581 dprintf(
"libc_realloc: curr: ");
584 if ((next <= block) && (next != &
marker)) {
597 if (
size < old_size) {
601 if ((next != &
marker) && (((
char *)block + old_size) == (
char *)next)) {
607 new_block->
next = next;
610 curr->
next = new_block;
612 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, ptr_);
621 size_t delta =
size - old_size;
622 if ((next != &
marker) && (((
char *)block + old_size) == (
char *)next) && (next->
size >= delta)) {
625 if (next->
size == delta) {
632 new_block->
size = next->
size - delta;
633 curr->
next = new_block;
636 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, ptr_);
650 if (new_ptr == NULL) {
651 dprintf(
"libc_realloc(%p, %u) -> NULL\n", ptr_, size_);
654 __builtin_memcpy(new_ptr, ptr_, old_size -
sizeof(
empty_block));
656 dprintf(
"libc_realloc(%p, %u) -> %p\n", ptr_, size_, new_ptr);
#define dprintf(...)
Definition alloc.c:238
void * libc_heap_start()
Returns the pointer to the beginning of the heap.
Definition alloc.c:676
void * libc_realloc(void *ptr_, size_t size_)
Re-allocates memory from the heap.
Definition alloc.c:481
void * __builtin_new(size_t size)
Definition alloc.c:661
void _ZdaPvj(void *ptr, unsigned int size)
Definition alloc.c:674
void _ZdaPv(void *ptr)
Definition alloc.c:670
#define ALIGN_TO(x)
Definition alloc.c:57
#define maximum_heap_end
Definition alloc.c:114
#define head
Definition alloc.c:111
void * libc_heap_end()
Returns the pointer to the end of the heap.
Definition alloc.c:677
#define marker
Definition alloc.c:115
#define print_block(x)
Definition alloc.c:239
#define bottom
Definition alloc.c:112
#define top
Definition alloc.c:113
#define check_integrity()
Definition alloc.c:240
void * libc_malloc(size_t size_)
Allocates memory from the heap.
Definition alloc.c:248
void * _Znwj(unsigned int size)
Definition alloc.c:664
void * _Znaj(unsigned int size)
Definition alloc.c:666
struct allocated_block_ allocated_block
void _ZdlPv(void *ptr)
Definition alloc.c:668
void libc_free(void *ptr_)
Frees memory from the heap.
Definition alloc.c:357
void _ZdlPvj(void *ptr, unsigned int size)
Definition alloc.c:672
struct empty_block_ empty_block
void __builtin_delete(void *ptr)
Definition alloc.c:662
static int size
Definition string.h:142
volatile uint32_t * ptr
Definition cop0.c:80
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
size_t size
Definition alloc.c:87
uintptr_t dummy
Definition alloc.c:85
size_t size
Definition alloc.c:77
struct empty_block_ * next
Definition alloc.c:72