marioparty4/include/game/jmp.h
Dávid Balatoni 34cf507e3f
x64 and hsfload improvements, build every REL (#582)
* Port some of hsfload.c

* More byteswaps in hsfload.c

* Finish hsfload besides cenv

* hsfload fixes

* Some x64 improvements

* More x64 improvements

* 64 bit improvements

* Link in lots of files

* Fix armem bug

* Fix dll killing, load modeseldll

* Fixes, clearing TODOs

* Tons of warning/error fixes

* Linux build fixes

* Add -fPIC flag to fix build on x64 linux

* GXSETARRAY sizes and misc fixes

* More fixes

* Build all RELs

* Implement C_Quat functions

* Fix PAL build
2025-04-14 18:02:42 +02:00

177 lines
4.2 KiB
C
Executable file

#ifndef _GAME_JMP_H
#define _GAME_JMP_H
#ifdef TARGET_PC
#include <stdint.h>
#ifdef _M_X64
#include "../extern/longjmp_win64/longjmp_win64.h"
#define SETJMP setjmp_win64
#define LONGJMP longjmp_win64
#define JMPBUF JMP_BUF_WIN64
#else
#include <setjmp.h>
#define SETJMP setjmp
#define LONGJMP longjmp
#define JMPBUF jmp_buf
#endif
#ifndef _JMP_BUF_DEFINED
#if defined(_M_IX86)
typedef struct __JUMP_BUFFER {
uint32_t Ebp;
uint32_t Ebx;
uint32_t Edi;
uint32_t Esi;
uint32_t Esp;
uint32_t Eip;
uint32_t Registration;
uint32_t TryLevel;
uint32_t Cookie;
uint32_t UnwindFunc;
uint32_t UnwindData[6];
} _JUMP_BUFFER;
#elif defined(__i386__)
typedef struct __JUMP_BUFFER {
uint32_t Bx;
uint32_t Si;
uint32_t Di;
uint32_t Bp;
uint32_t Sp;
uint32_t Pc;
} _JUMP_BUFFER;
#elif defined(__x86_64__)
typedef struct __JUMP_BUFFER {
uint64_t Rbx;
uint64_t Rbp;
uint64_t R12;
uint64_t R13;
uint64_t R14;
uint64_t R15;
uint64_t Rsp;
uint64_t Pc;
} _JUMP_BUFFER;
#elif defined(_M_ARM)
typedef struct _JUMP_BUFFER {
uint32_t Frame;
uint32_t R4;
uint32_t R5;
uint32_t R6;
uint32_t R7;
uint32_t R8;
uint32_t R9;
uint32_t R10;
uint32_t R11;
uint32_t Sp;
uint32_t Pc;
uint32_t Fpscr;
uint32_t long D[8]; // D8-D15 VFP/NEON regs
} _JUMP_BUFFER;
#elif defined(_M_ARM64)
typedef struct _JUMP_BUFFER {
uint64_t Frame;
uint64_t Reserved;
uint64_t X19; // x19 -- x28: callee saved registers
uint64_t X20;
uint64_t X21;
uint64_t X22;
uint64_t X23;
uint64_t X24;
uint64_t X25;
uint64_t X26;
uint64_t X27;
uint64_t X28;
uint64_t Fp; // x29 frame pointer
uint64_t Lr; // x30 link register
uint64_t Sp; // x31 stack pointer
uint32_t Fpcr; // fp control register
uint32_t Fpsr; // fp status register
double D[8]; // D8-D15 FP regs
} _JUMP_BUFFER;
#elif defined(__riscv)
typedef struct _JUMP_BUFFER {
uint32_t ra;
uint32_t sp;
uint32_t s0;
uint32_t s1;
uint32_t s2;
uint32_t s3;
uint32_t s4;
uint32_t s5;
uint32_t s6;
uint32_t s7;
uint32_t s8;
uint32_t s9;
uint32_t s10;
uint32_t s11;
#if __riscv_xlen == 64
uint64_t fs0;
uint64_t fs1;
uint64_t fs2;
uint64_t fs3;
uint64_t fs4;
uint64_t fs5;
uint64_t fs6;
uint64_t fs7;
uint64_t fs8;
uint64_t fs9;
uint64_t fs10;
uint64_t fs11;
#endif
} _JUMP_BUFFER;
#endif
#endif
#if defined(_M_IX86)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Eip = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Esp = (uintptr_t)sp
#elif defined(__i386__)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Pc = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Sp = (uintptr_t)sp
#elif defined(__x86_64__)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Pc = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Rsp = (uintptr_t)sp
#elif defined(_M_X64)
#define SETJMP_SET_IP(jump, func) (jump)->rip_getjmp = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) (jump)->rsp_getjmp = (uintptr_t)sp
#elif defined(_M_ARM) || defined(__arm__)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Pc = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Sp = (uintptr_t)sp
#elif defined(_M_ARM64) || defined(__aarch64__)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Lr = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Sp = (uintptr_t)sp
#elif defined(__riscv)
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->ra = (uintptr_t)func
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->sp = (uintptr_t)sp
#endif
#else
#include "dolphin.h"
typedef struct jmp_buf {
u32 lr;
u32 cr;
u32 sp;
u32 r2;
u32 pad;
u32 regs[19];
double flt_regs[19];
} jmp_buf;
s32 gcsetjmp(jmp_buf *jump);
s32 gclongjmp(jmp_buf *jump, s32 status);
#define JMPBUF jmp_buf
#define SETJMP(jump) gcsetjmp(&(jump))
#define LONGJMP(jump, status) gclongjmp(&(jump), (status))
#define SETJMP_SET_IP(jump, func) jump.lr = (u32)func
#define SETJMP_SET_SP(jump, stack_ptr) jump.sp = (u32)stack_ptr
#endif
#endif