mirror of
https://github.com/Team-Resurgent/Simple_NTFS_ISO_Mounter.git
synced 2026-08-15 11:18:28 -07:00
277 lines
7.5 KiB
C
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
|