mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-24 00:51:29 -04:00
Some Runtime.PPCEABI.H files
This commit is contained in:
+2
-2
@@ -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"),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user