From 7779a34215ce04fb38dc3a587484a4e921760510 Mon Sep 17 00:00:00 2001 From: Noah McQueen Date: Thu, 12 Oct 2023 14:47:18 -0600 Subject: [PATCH] Some Runtime.PPCEABI.H files --- configure.py | 4 +-- include/Runtime.PPCEABI.H/__va_arg.h | 4 +-- src/Runtime.PPCEABI.H/CPlusLibPPC.cp | 26 +++++++++++++++++ src/Runtime.PPCEABI.H/GCN_mem_alloc.c | 33 +++++++++++++++++++++ src/Runtime.PPCEABI.H/__va_arg.c | 42 +++++++++++++++++++++++++++ 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/Runtime.PPCEABI.H/CPlusLibPPC.cp create mode 100644 src/Runtime.PPCEABI.H/GCN_mem_alloc.c create mode 100644 src/Runtime.PPCEABI.H/__va_arg.c diff --git a/configure.py b/configure.py index 1f6dedf35..1be2bb7a4 100644 --- a/configure.py +++ b/configure.py @@ -1066,9 +1066,9 @@ config.libs = [ "host": False, "objects": [ Object(NonMatching, "Runtime.PPCEABI.H/__mem.c"), - Object(NonMatching, "Runtime.PPCEABI.H/__va_arg.c"), + Object(Matching, "Runtime.PPCEABI.H/__va_arg.c"), Object(Matching, "Runtime.PPCEABI.H/global_destructor_chain.c"), - Object(NonMatching, "Runtime.PPCEABI.H/CPlusLibPPC.cp"), + Object(Matching, "Runtime.PPCEABI.H/CPlusLibPPC.cp"), Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cp"), Object(NonMatching, "Runtime.PPCEABI.H/ptmf.c"), Object(NonMatching, "Runtime.PPCEABI.H/runtime.c"), diff --git a/include/Runtime.PPCEABI.H/__va_arg.h b/include/Runtime.PPCEABI.H/__va_arg.h index 64378bddb..872e91496 100644 --- a/include/Runtime.PPCEABI.H/__va_arg.h +++ b/include/Runtime.PPCEABI.H/__va_arg.h @@ -28,9 +28,9 @@ void* __va_arg(_va_list_struct*, int); // __builtin_va_info: initialize the __va_list_struct // _var_arg_typeof: convert type to integer for __va_arg #define __va_start(list, fmt) __builtin_va_info(&list) -#define __va_arg(list, type) (*((type*)__va_arg(ap, _var_arg_typeof(type)))) +// #define __va_arg(list, type) (*((type*)__va_arg(ap, _var_arg_typeof(type)))) #define va_start __va_start -#define va_arg __va_arg +// #define va_arg __va_arg #define va_end __va_end #define va_list __va_list #define __va_end(list) ((void)0) diff --git a/src/Runtime.PPCEABI.H/CPlusLibPPC.cp b/src/Runtime.PPCEABI.H/CPlusLibPPC.cp new file mode 100644 index 000000000..ef34c1f89 --- /dev/null +++ b/src/Runtime.PPCEABI.H/CPlusLibPPC.cp @@ -0,0 +1,26 @@ +#include "dolphin/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern void* __copy(char*, char*, size_t); + +#ifdef __cplusplus +} +#endif + +void* __copy(char* dest, char* src, size_t size) { + char* p; + + if (dest && size) { + p = dest; + do { + *p = *src; + ++p; + ++src; + --size; + } while (size); + } + return dest; +} \ No newline at end of file diff --git a/src/Runtime.PPCEABI.H/GCN_mem_alloc.c b/src/Runtime.PPCEABI.H/GCN_mem_alloc.c new file mode 100644 index 000000000..f9f4d65f7 --- /dev/null +++ b/src/Runtime.PPCEABI.H/GCN_mem_alloc.c @@ -0,0 +1,33 @@ +#include "Runtime.PPCEABI.H/GCN_mem_alloc.h" +#include "dolphin/os/OS.h" + + +inline static void InitDefaultHeap() { + void* arenaLo; + void* arenaHi; + + /* NONMATCH: OSReport strings should be two separate rodata entries with padding */ + OSReport("GCN_Mem_Alloc.c : InitDefaultHeap. No Heap Available\n"); + OSReport("Metrowerks CW runtime library initializing default heap\n"); + + arenaLo = OSGetArenaLo(); + arenaHi = OSGetArenaHi(); + + arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); + OSSetArenaLo(arenaLo); + + arenaLo = (void*)OSRoundUp32B(arenaLo); + arenaHi = (void*)OSRoundDown32B(arenaHi); + + OSSetCurrentHeap(OSCreateHeap(arenaLo, arenaHi)); + OSSetArenaLo(arenaLo = arenaHi); +} + +void __sys_free(void* ptr) { + if (__OSCurrHeap == -1) { + InitDefaultHeap(); + } + + OSFreeToHeap(__OSCurrHeap, ptr); + return; +} \ No newline at end of file diff --git a/src/Runtime.PPCEABI.H/__va_arg.c b/src/Runtime.PPCEABI.H/__va_arg.c new file mode 100644 index 000000000..ca2514940 --- /dev/null +++ b/src/Runtime.PPCEABI.H/__va_arg.c @@ -0,0 +1,42 @@ +#include "Runtime.PPCEABI.H/__va_arg.h" + +void* __va_arg(va_list v_list, int type) { + char* addr; + char* reg = &(v_list->gpr); + s32 g_reg = v_list->gpr; + s32 maxsize = 8; + s32 size = 4; + s32 increment = 1; + s32 even = 0; + s32 fpr_offset = 0; + s32 regsize = 4; + + if (type == 3) { + reg = &(v_list->fpr); + g_reg = v_list->fpr; + size = 8; + fpr_offset = 32; + regsize = 8; + } + if (type == 2) { + size = 8; + maxsize--; + if (g_reg & 1) + even = 1; + increment = 2; + } + if (g_reg < maxsize) { + g_reg += even; + addr = v_list->reg_save_area + fpr_offset + (g_reg * regsize); + *reg = g_reg + increment; + } else { + *reg = 8; + addr = v_list->input_arg_area; + addr = (char*)(((u32)(addr) + ((size)-1)) & ~((size)-1)); + v_list->input_arg_area = addr + size; + } + if (type == 0) + addr = *((char**)addr); + + return addr; +} \ No newline at end of file