amiga-ixemul/ixnet/gates.c

176 lines
4.4 KiB
C

#include <exec/types.h>
#include <emul/emulinterface.h>
#include <emul/emulregs.h>
/* Don't include any std include, or gcc will report that prototypes
don't match. */
#define FUNC_I_(func) \
int func(void); \
int _trampoline_ ## func(void) { \
return func(); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_I(func) \
int func(int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_II(func) \
int func(int, int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1], p[2]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_III(func) \
int func(int, int, int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1], p[2], p[3]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_IIII(func) \
int func(int, int, int, int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1], p[2], p[3], p[4]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_IIIII(func) \
int func(int, int, int, int, int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1], p[2], p[3], p[4], p[5]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_I_IIIIII(func) \
int func(int, int, int, int, int, int); \
int _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
return func(p[1], p[2], p[3], p[4], p[5], p[6]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIB, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_(func) \
void func(void); \
void _trampoline_ ## func(void) { \
func(); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_I(func) \
void func(int); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
func(p[1]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_II(func) \
void func(int, int); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
func(p[1], p[2]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_IIA(func) \
void _varargs68k_ ## func(int, int, void *); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
_varargs68k_ ## func(p[1], p[2], (void *)p[3]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_III(func) \
void func(int, int, int); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
func(p[1], p[2], p[3]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_IIII(func) \
void func(int, int, int, int); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
func(p[1], p[2], p[3], p[4]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_IIIII(func) \
void func(int, int, int, int, int); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
func(p[1], p[2], p[3], p[4], p[5]); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_V_IIV(func) \
void _varargs68k_ ## func(int, int, void *); \
void _trampoline_ ## func(void) { \
GETEMULHANDLE \
int *p = (int *)REG_A7; \
_varargs68k_ ## func(p[1], p[2], p + 3); \
} \
const struct EmulLibEntry _gate_ ## func = { \
TRAP_LIBNR, 0, (void(*)())_trampoline_ ## func \
};
#define FUNC_X(func) \
extern struct EmulLibEntry _gate_ ## func;
#define SYSTEM_CALL(func, vec, args) FUNC_##args(func)
#include <sys/ixnet_syscall.def>
#undef SYSTEM_CALL