Rename jmp_buf due to a name collision in STD

This commit is contained in:
dbalatoni13 2025-04-02 04:52:55 +02:00
parent 84801ecdc7
commit 5eb32764a5
4 changed files with 79 additions and 67 deletions

View file

@ -3,7 +3,7 @@
#include "dolphin.h" #include "dolphin.h"
typedef struct jump_buf { typedef struct JMPBUF {
u32 lr; u32 lr;
u32 cr; u32 cr;
u32 sp; u32 sp;
@ -11,9 +11,9 @@ typedef struct jump_buf {
u32 pad; u32 pad;
u32 regs[19]; u32 regs[19];
double flt_regs[19]; double flt_regs[19];
} jmp_buf; } JMPBUF;
s32 gcsetjmp(jmp_buf *jump); s32 gcsetjmp(JMPBUF *jump);
s32 gclongjmp(jmp_buf *jump, s32 status); s32 gclongjmp(JMPBUF *jump, s32 status);
#endif #endif

View file

@ -1,8 +1,9 @@
#ifndef _GAME_PROCESS_H #ifndef _GAME_PROCESS_H
#define _GAME_PROCESS_H #define _GAME_PROCESS_H
#include "game/jmp.h"
#include "dolphin/types.h" #include "dolphin/types.h"
#include "game/jmp.h"
#define PROCESS_STAT_PAUSE 0x1 #define PROCESS_STAT_PAUSE 0x1
#define PROCESS_STAT_UPAUSE 0x2 #define PROCESS_STAT_UPAUSE 0x2
@ -22,7 +23,7 @@ typedef struct process {
u16 prio; u16 prio;
s32 sleep_time; s32 sleep_time;
u32 base_sp; u32 base_sp;
jmp_buf jump; JMPBUF jump;
void (*dtor)(void); void (*dtor)(void);
void *user_data; void *user_data;
} Process; } Process;

View file

@ -1,6 +1,7 @@
#include "game/jmp.h" #include "game/jmp.h"
s32 gcsetjmp(register jmp_buf *jump) { s32 gcsetjmp(register JMPBUF *jump)
{
// clang-format off // clang-format off
asm { asm {
mflr r5 mflr r5
@ -36,7 +37,7 @@ s32 gcsetjmp(register jmp_buf *jump) {
} }
// clang-format off // clang-format off
asm s32 gclongjmp(register jmp_buf *jump, register s32 status) { asm s32 gclongjmp(register JMPBUF *jump, register s32 status) {
nofralloc nofralloc
lwz r5, jump->lr lwz r5, jump->lr
lwz r6, jump->cr lwz r6, jump->cr

View file

@ -1,6 +1,7 @@
#include "game/process.h" #include "game/process.h"
#include "game/memory.h"
#include "dolphin/os.h" #include "dolphin/os.h"
#include "game/memory.h"
#define FAKE_RETADDR 0xA5A5A5A5 #define FAKE_RETADDR 0xA5A5A5A5
@ -9,7 +10,7 @@
#define EXEC_CHILDWATCH 2 #define EXEC_CHILDWATCH 2
#define EXEC_KILLED 3 #define EXEC_KILLED 3
static jmp_buf processjmpbuf; static JMPBUF processjmpbuf;
static Process *processtop; static Process *processtop;
static Process *processcur; static Process *processcur;
static u16 processcnt; static u16 processcnt;
@ -21,7 +22,8 @@ void HuPrcInit(void)
processtop = NULL; processtop = NULL;
} }
static void LinkProcess(Process** root, Process* process) { static void LinkProcess(Process **root, Process *process)
{
Process *src_process = *root; Process *src_process = *root;
if (src_process && (src_process->prio >= process->prio)) { if (src_process && (src_process->prio >= process->prio)) {
@ -35,7 +37,8 @@ static void LinkProcess(Process** root, Process* process) {
if (process->next) { if (process->next) {
process->next->prev = process; process->next->prev = process;
} }
} else { }
else {
process->next = (*root); process->next = (*root);
process->prev = NULL; process->prev = NULL;
*root = process; *root = process;
@ -44,13 +47,15 @@ static void LinkProcess(Process** root, Process* process) {
} }
} }
} }
static void UnlinkProcess(Process **root, Process *process) { static void UnlinkProcess(Process **root, Process *process)
{
if (process->next) { if (process->next) {
process->next->prev = process->prev; process->next->prev = process->prev;
} }
if (process->prev) { if (process->prev) {
process->prev->next = process->next; process->prev->next = process->next;
} else { }
else {
*root = process->next; *root = process->next;
} }
} }
@ -63,9 +68,7 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz
if (stack_size == 0) { if (stack_size == 0) {
stack_size = 2048; stack_size = 2048;
} }
alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process)) alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process)) + HuMemMemoryAllocSizeGet(stack_size) + HuMemMemoryAllocSizeGet(extra_size);
+HuMemMemoryAllocSizeGet(stack_size)
+HuMemMemoryAllocSizeGet(extra_size);
if (!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) { if (!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) {
OSReport("process> malloc error size %d\n", alloc_size); OSReport("process> malloc error size %d\n", alloc_size);
return NULL; return NULL;
@ -110,7 +113,8 @@ void HuPrcChildUnlink(Process *process)
} }
if (process->first_child) { if (process->first_child) {
process->first_child->next_child = process->next_child; process->first_child->next_child = process->next_child;
} else { }
else {
process->parent->child = process->next_child; process->parent->child = process->next_child;
} }
process->parent = NULL; process->parent = NULL;
@ -146,7 +150,8 @@ static s32 SetKillStatusProcess(Process *process)
HuPrcWakeup(process); HuPrcWakeup(process);
process->exec = EXEC_KILLED; process->exec = EXEC_KILLED;
return 0; return 0;
} else { }
else {
return -1; return -1;
} }
} }
@ -238,8 +243,10 @@ void HuPrcCall(s32 tick)
case 1: case 1:
if (((u8 *)(processcur->heap))[4] != 165) { if (((u8 *)(processcur->heap))[4] != 165) {
printf("stack overlap error.(process pointer %x)\n", processcur); printf("stack overlap error.(process pointer %x)\n", processcur);
while(1); while (1)
} else { ;
}
else {
processcur = processcur->next; processcur = processcur->next;
} }
break; break;
@ -268,7 +275,8 @@ void HuPrcCall(s32 tick)
case EXEC_CHILDWATCH: case EXEC_CHILDWATCH:
if (process->child) { if (process->child) {
ret = 1; ret = 1;
} else { }
else {
process->exec = EXEC_NORMAL; process->exec = EXEC_NORMAL;
ret = 0; ret = 0;
} }
@ -315,7 +323,8 @@ void HuPrcAllPause(s32 flag)
process = process->next; process = process->next;
} }
} else { }
else {
while (process != NULL) { while (process != NULL) {
if (process->stat & PROCESS_STAT_PAUSE) { if (process->stat & PROCESS_STAT_PAUSE) {
HuPrcResetStat(process, PROCESS_STAT_PAUSE); HuPrcResetStat(process, PROCESS_STAT_PAUSE);
@ -337,7 +346,8 @@ void HuPrcAllUPause(s32 flag)
process = process->next; process = process->next;
} }
} else { }
else {
while (process != NULL) { while (process != NULL) {
if (process->stat & PROCESS_STAT_UPAUSE) { if (process->stat & PROCESS_STAT_UPAUSE) {
HuPrcResetStat(process, PROCESS_STAT_UPAUSE); HuPrcResetStat(process, PROCESS_STAT_UPAUSE);