Files

277 lines
7.5 KiB
C

#pragma once
#include <stdint.h>
#ifndef NULL
#define NULL 0
#endif
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
typedef uint16_t u16;
typedef int32_t s32;
typedef uint32_t u32;
typedef int64_t s64;
typedef uint64_t u64;
typedef float f32;
typedef double f64;
typedef volatile int8_t vs8;
typedef volatile uint8_t vu8;
typedef volatile int16_t vs16;
typedef volatile uint16_t vu16;
typedef volatile int32_t vs32;
typedef volatile uint32_t vu32;
typedef volatile int64_t vs64;
typedef volatile uint64_t vu64;
typedef volatile float vf32;
typedef volatile double vf64;
typedef struct opd64 {
void* func;
void* rtoc;
u64 zero;
} opd64;
typedef struct opd32 {
u32 func;
u32 rtoc;
} opd32;
extern opd64 opd64_start[];
extern opd32 opd32_start[];
#define OPD32(ptr) (opd32_start + ((opd64*)ptr - opd64_start))
typedef u32 mem_container_t;
// 32bit types
typedef u32 lv2_void;
typedef u32 lv2_size_t;
typedef s64 system_time_t;
struct timeval_32 {
u32 tv_sec;
s32 tv_usec;
};
#ifdef __cplusplus
#define EXTERN_BEGIN extern "C" {
#define EXTERN_END }
#else
#define EXTERN_BEGIN
#define EXTERN_END
#endif
// lv2 retail 3.41
#define LV2_SYSCALL_TABLE 0x80000000002EB128ULL
#define LV2_INLINE static inline __attribute__((unused))
#define LV2_SYSCALL LV2_INLINE s32
#define __lv2syscallarg0
#define __lv2syscallarg1 __lv2syscallarg0, u64 a1
#define __lv2syscallarg2 __lv2syscallarg1, u64 a2
#define __lv2syscallarg3 __lv2syscallarg2, u64 a3
#define __lv2syscallarg4 __lv2syscallarg3, u64 a4
#define __lv2syscallarg5 __lv2syscallarg4, u64 a5
#define __lv2syscallarg6 __lv2syscallarg5, u64 a6
#define __lv2syscallarg7 __lv2syscallarg6, u64 a7
#define __lv2syscallarg8 __lv2syscallarg7, u64 a8
#define __lv2syscallargt0
#define __lv2syscallargt1 u64
#define __lv2syscallargt2 __lv2syscallargt1, u64
#define __lv2syscallargt3 __lv2syscallargt2, u64
#define __lv2syscallargt4 __lv2syscallargt3, u64
#define __lv2syscallargt5 __lv2syscallargt4, u64
#define __lv2syscallargt6 __lv2syscallargt5, u64
#define __lv2syscallargt7 __lv2syscallargt6, u64
#define __lv2syscallargt8 __lv2syscallargt7, u64
#define __lv2syscall0
#define __lv2syscall1 a1
#define __lv2syscall2 __lv2syscall1, a2
#define __lv2syscall3 __lv2syscall2, a3
#define __lv2syscall4 __lv2syscall3, a4
#define __lv2syscall5 __lv2syscall4, a5
#define __lv2syscall6 __lv2syscall5, a6
#define __lv2syscall7 __lv2syscall6, a7
#define __lv2syscall8 __lv2syscall7, a8
#ifdef LV2
#define __lv2syscall(num) \
LV2_INLINE u64 Lv2Syscall##num(u64 syscall __lv2syscallarg##num) \
{ \
u64 (*syscallopd)(__lv2syscallargt##num) = (u64 (*)(__lv2syscallargt##num))*(u64*)(LV2_SYSCALL_TABLE + syscall * 8); \
return syscallopd(__lv2syscall##num); \
}
__lv2syscall(0);
__lv2syscall(1);
__lv2syscall(2);
__lv2syscall(3);
__lv2syscall(4);
__lv2syscall(5);
__lv2syscall(6);
__lv2syscall(7);
__lv2syscall(8);
#else
#define __lv2syscallclobber8 "r0", "r2", "r12", "lr", \
"ctr", "xer", "cr0", "cr1", "cr5", "cr6", "cr7", \
"memory"
#define __lv2syscallclobber7 __lv2syscallclobber8, "r10"
#define __lv2syscallclobber6 __lv2syscallclobber7, "r9"
#define __lv2syscallclobber5 __lv2syscallclobber6, "r8"
#define __lv2syscallclobber4 __lv2syscallclobber5, "r7"
#define __lv2syscallclobber3 __lv2syscallclobber4, "r6"
#define __lv2syscallclobber2 __lv2syscallclobber3, "r5"
#define __lv2syscallclobber1 __lv2syscallclobber2, "r4"
#define __lv2syscallclobber0 __lv2syscallclobber1, "r3"
#define __lv2syscallreg(num, reg) \
register u64 p##num __asm__(reg) = a##num
#define __lv2syscallregs \
register u64 s __asm__("11") = syscall
#define __lv2syscallparam1(reg) reg(p1), reg(s)
#define __lv2syscallparam2(reg) reg(p1), reg(p2), reg(s)
#define __lv2syscallparam3(reg) reg(p1), reg(p2), reg(p3), reg(s)
#define __lv2syscallparam4(reg) reg(p1), reg(p2), reg(p3), reg(p4), reg(s)
#define __lv2syscallparam5(reg) reg(p1), reg(p2), reg(p3), reg(p4), reg(p5), reg(s)
#define __lv2syscallparam6(reg) reg(p1), reg(p2), reg(p3), reg(p4), reg(p5), reg(p6), reg(s)
#define __lv2syscallparam7(reg) reg(p1), reg(p2), reg(p3), reg(p4), reg(p5), reg(p6), reg(p7), reg(s)
#define __lv2syscallparam8(reg) reg(p1), reg(p2), reg(p3), reg(p4), reg(p5), reg(p6), reg(p7), reg(p8), reg(s)
LV2_INLINE u64 Lv2Syscall0(u64 syscall __lv2syscallarg0) {
__lv2syscallregs;
register u64 p1 __asm__("3") = 0;
__asm__ volatile("sc"
: __lv2syscallparam1("=r")
: __lv2syscallparam1("r")
: __lv2syscallclobber1);
return p1;
}
LV2_INLINE u64 Lv2Syscall1(u64 syscall __lv2syscallarg1) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__asm__ volatile("sc"
: __lv2syscallparam1("=r")
: __lv2syscallparam1("r")
: __lv2syscallclobber1);
return p1;
}
LV2_INLINE u64 Lv2Syscall2(u64 syscall __lv2syscallarg2) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__asm__ volatile("sc"
: __lv2syscallparam2("=r")
: __lv2syscallparam2("r")
: __lv2syscallclobber2);
return p1;
}
LV2_INLINE u64 Lv2Syscall3(u64 syscall __lv2syscallarg3) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__asm__ volatile("sc"
: __lv2syscallparam3("=r")
: __lv2syscallparam3("r")
: __lv2syscallclobber3);
return p1;
}
LV2_INLINE u64 Lv2Syscall4(u64 syscall __lv2syscallarg4) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__lv2syscallreg(4, "6");
__asm__ volatile("sc"
: __lv2syscallparam4("=r")
: __lv2syscallparam4("r")
: __lv2syscallclobber4);
return p1;
}
LV2_INLINE u64 Lv2Syscall5(u64 syscall __lv2syscallarg5) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__lv2syscallreg(4, "6");
__lv2syscallreg(5, "7");
__asm__ volatile("sc"
: __lv2syscallparam5("=r")
: __lv2syscallparam5("r")
: __lv2syscallclobber5);
return p1;
}
LV2_INLINE u64 Lv2Syscall6(u64 syscall __lv2syscallarg6) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__lv2syscallreg(4, "6");
__lv2syscallreg(5, "7");
__lv2syscallreg(6, "8");
__asm__ volatile("sc"
: __lv2syscallparam6("=r")
: __lv2syscallparam6("r")
: __lv2syscallclobber6);
return p1;
}
LV2_INLINE u64 Lv2Syscall7(u64 syscall __lv2syscallarg7) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__lv2syscallreg(4, "6");
__lv2syscallreg(5, "7");
__lv2syscallreg(6, "8");
__lv2syscallreg(7, "9");
__asm__ volatile("sc"
: __lv2syscallparam7("=r")
: __lv2syscallparam7("r")
: __lv2syscallclobber7);
return p1;
}
LV2_INLINE u64 Lv2Syscall8(u64 syscall __lv2syscallarg8) {
__lv2syscallregs;
__lv2syscallreg(1, "3");
__lv2syscallreg(2, "4");
__lv2syscallreg(3, "5");
__lv2syscallreg(4, "6");
__lv2syscallreg(5, "7");
__lv2syscallreg(6, "8");
__lv2syscallreg(7, "9");
__lv2syscallreg(8, "10");
__asm__ volatile("sc"
: __lv2syscallparam8("=r")
: __lv2syscallparam8("r")
: __lv2syscallclobber8);
return p1;
}
#endif
#ifdef __cplusplus
#define __lv2syscallcomma0
#define __lv2syscallcomma1 ,
#define __lv2syscallcomma2 ,
#define __lv2syscallcomma3 ,
#define __lv2syscallcomma4 ,
#define __lv2syscallcomma5 ,
#define __lv2syscallcomma6 ,
#define __lv2syscallcomma7 ,
#define __lv2syscallcomma8 ,
#define __lv2syscallcpp(num) \
LV2_INLINE u64 Lv2Syscall(u64 syscall __lv2syscallarg##num) \
{ \
return Lv2Syscall##num(syscall __lv2syscallcomma##num __lv2syscall##num); \
}
__lv2syscallcpp(0);
__lv2syscallcpp(1);
__lv2syscallcpp(2);
__lv2syscallcpp(3);
__lv2syscallcpp(4);
__lv2syscallcpp(5);
__lv2syscallcpp(6);
__lv2syscallcpp(7);
__lv2syscallcpp(8);
#endif