280 lines
6.7 KiB
C
280 lines
6.7 KiB
C
#define _KERNEL
|
|
#include <exec/resident.h>
|
|
#include <exec/libraries.h>
|
|
#include "ixemul.h"
|
|
#include "ixnet.h"
|
|
#include "version.h"
|
|
#include "kprintf.h"
|
|
|
|
#define STR(x) #x
|
|
|
|
struct ixnet_base *ixnet_init(struct ixnet_base *ixbase);
|
|
struct ixnet_base *ixnet_open(struct ixnet_base *ixbase);
|
|
void ixnet_close(struct ixnet_base *ixbase);
|
|
void ixnet_expunge(struct ixnet_base *ixbase);
|
|
|
|
int (*funcTable[])();
|
|
extern int (*ppcFuncTable[])();
|
|
|
|
struct ixnet_base* _initRoutine(struct ixnet_base *base,
|
|
BPTR seglist,
|
|
struct ExecBase *sysbase);
|
|
|
|
struct LibInitStruct {
|
|
ULONG LibSize;
|
|
void *FuncTable;
|
|
void *DataTable;
|
|
void (*InitFunc)(void);
|
|
};
|
|
|
|
struct LibInitStruct Init={
|
|
sizeof(struct ixnet_base),
|
|
funcTable,
|
|
NULL,
|
|
(void (*)(void)) &_initRoutine
|
|
};
|
|
|
|
|
|
struct Resident initDDescrip={
|
|
RTC_MATCHWORD,
|
|
&initDDescrip,
|
|
&initDDescrip + 1,
|
|
RTF_PPC | RTF_AUTOINIT | RTF_EXTENDED,
|
|
IXNET_VERSION,
|
|
NT_LIBRARY,
|
|
IXNET_PRIORITY,
|
|
IXNET_NAME,
|
|
IXNET_IDSTRING "\r\n",
|
|
&Init,
|
|
IXNET_REVISION,
|
|
NULL
|
|
};
|
|
|
|
/*
|
|
* To tell the loader that this is a new emulppc elf and not
|
|
* one for the ppc.library.
|
|
* ** IMPORTANT **
|
|
*/
|
|
ULONG __abox__=1;
|
|
|
|
|
|
int libReserved(void) {
|
|
return 0;
|
|
}
|
|
|
|
/* RTF_PPC flag set, so the initialization routine is called
|
|
* as a normal PPC SysV4 ABI */
|
|
struct ixnet_base *_initRoutine(struct ixnet_base *base,
|
|
BPTR seglist,
|
|
struct ExecBase *sysbase) {
|
|
KPRINTF(("init(%lx,%lx,%lx)\n",base,seglist,sysbase));
|
|
base->ix_seg_list = seglist;
|
|
base->basearray = ppcFuncTable;
|
|
return ixnet_init(base);
|
|
}
|
|
|
|
|
|
struct ixnet_base *libOpen(void) {
|
|
struct ixnet_base *base = (struct ixnet_base *) REG_A6;
|
|
KPRINTF(("Open(%lx)\n",base));
|
|
|
|
++base->ixnet_lib.lib_OpenCnt;
|
|
base->ixnet_lib.lib_Flags &= ~LIBF_DELEXP;
|
|
if(!ixnet_open(base))
|
|
{
|
|
--base->ixnet_lib.lib_OpenCnt;
|
|
base = NULL;
|
|
}
|
|
return base;
|
|
}
|
|
|
|
ULONG libExpungeFunc(struct ixnet_base *base) {
|
|
ULONG seg;
|
|
|
|
/* assume we can't expunge */
|
|
seg = 0;
|
|
base->ixnet_lib.lib_Flags |= LIBF_DELEXP;
|
|
|
|
if (base->ixnet_lib.lib_OpenCnt == 0)
|
|
{
|
|
Remove(&base->ixnet_lib.lib_Node);
|
|
|
|
ixnet_expunge(base);
|
|
|
|
seg = base->ix_seg_list;
|
|
|
|
FreeMem((char *)base - base->ixnet_lib.lib_NegSize,
|
|
base->ixnet_lib.lib_NegSize + base->ixnet_lib.lib_PosSize);
|
|
}
|
|
|
|
return seg;
|
|
}
|
|
|
|
ULONG libExpunge(void) {
|
|
struct ixnet_base *base = (struct ixnet_base *) REG_A6;
|
|
return libExpungeFunc(base);
|
|
}
|
|
|
|
ULONG libClose(void) {
|
|
struct ixnet_base *base = (struct ixnet_base *) REG_A6;
|
|
|
|
ixnet_close(base);
|
|
|
|
if (--base->ixnet_lib.lib_OpenCnt == 0 &&
|
|
base->ixnet_lib.lib_Flags & LIBF_DELEXP)
|
|
return libExpungeFunc(base);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static const struct EmulLibEntry _gate_libOpen={
|
|
TRAP_LIB, 0, (void(*)(void))libOpen
|
|
};
|
|
|
|
static const struct EmulLibEntry _gate_libClose={
|
|
TRAP_LIB, 0, (void(*)(void))libClose
|
|
};
|
|
|
|
static const struct EmulLibEntry _gate_libExpunge={
|
|
TRAP_LIB, 0, (void(*)(void))libExpunge
|
|
};
|
|
|
|
static const struct EmulLibEntry _gate_libReserved={
|
|
TRAP_LIB, 0, (void(*)(void))libReserved
|
|
};
|
|
|
|
void obsolete(void) {}
|
|
|
|
static const struct EmulLibEntry _gate_obsolete={
|
|
TRAP_LIBNR, 0, obsolete
|
|
};
|
|
|
|
/* declare the gates */
|
|
|
|
#define _gate_obsolete29 _gate_obsolete
|
|
#define _gate_obsolete30 _gate_obsolete
|
|
#define _gate_obsolete31 _gate_obsolete
|
|
#define _gate_obsolete32 _gate_obsolete
|
|
#define _gate_obsolete33 _gate_obsolete
|
|
#define _gate_obsolete34 _gate_obsolete
|
|
#define _gate_obsolete35 _gate_obsolete
|
|
#define _gate_obsolete36 _gate_obsolete
|
|
#define _gate_obsolete37 _gate_obsolete
|
|
#define _gate_obsolete40 _gate_obsolete
|
|
#define _gate_obsolete41 _gate_obsolete
|
|
#define _gate_obsolete47 _gate_obsolete
|
|
#define _gate_obsolete56 _gate_obsolete
|
|
#define _gate_obsolete57 _gate_obsolete
|
|
#define _gate_obsolete58 _gate_obsolete
|
|
#define _gate_obsolete59 _gate_obsolete
|
|
#define _gate_obsolete74 _gate_obsolete
|
|
#define _gate_obsolete75 _gate_obsolete
|
|
#define _gate_obsolete76 _gate_obsolete
|
|
#define _gate_obsolete77 _gate_obsolete
|
|
#define _gate_obsolete78 _gate_obsolete
|
|
#define _gate_obsolete79 _gate_obsolete
|
|
#define _gate_obsolete80 _gate_obsolete
|
|
#define _gate_obsolete81 _gate_obsolete
|
|
#define _gate_obsolete82 _gate_obsolete
|
|
#define _gate_obsolete83 _gate_obsolete
|
|
#define _gate_obsolete84 _gate_obsolete
|
|
#define _gate_obsolete95 _gate_obsolete
|
|
#define _gate_obsolete96 _gate_obsolete
|
|
#define _gate_obsolete97 _gate_obsolete
|
|
#define _gate_obsolete98 _gate_obsolete
|
|
#define _gate_obsolete99 _gate_obsolete
|
|
#define _gate_obsolete100 _gate_obsolete
|
|
#define _gate_obsolete102 _gate_obsolete
|
|
|
|
#ifdef TRACE_LIBRARY
|
|
#define SYSTEM_CALL(func, vec, nargs) extern const struct EmulLibEntry _gate_trace_ ## func;
|
|
#else
|
|
#define SYSTEM_CALL(func, vec, nargs) extern const struct EmulLibEntry _gate_ ## func;
|
|
#endif
|
|
#include <sys/ixnet_syscall.def>
|
|
#undef SYSTEM_CALL
|
|
|
|
/* The library 68k gates table. We use gates that read the function
|
|
* arguments from the stack and put them in registers. */
|
|
|
|
int (*funcTable[])() = {
|
|
|
|
/* standard system routines */
|
|
(int(*)())&_gate_libOpen,
|
|
(int(*)())&_gate_libClose,
|
|
(int(*)())&_gate_libExpunge,
|
|
(int(*)())&_gate_libReserved,
|
|
|
|
/* my libraries definitions */
|
|
|
|
#ifdef TRACE_LIBRARY
|
|
#define SYSTEM_CALL(func, vec, nargs) (int(*)())&_gate_trace_ ## func,
|
|
#else
|
|
#define SYSTEM_CALL(func, vec, nargs) (int(*)())&_gate_ ## func,
|
|
#endif
|
|
#include <sys/ixnet_syscall.def>
|
|
#undef SYSTEM_CALL
|
|
|
|
(int(*)())-1
|
|
};
|
|
|
|
/* The library ppc functions table. */
|
|
/* Hack: build that table in asm to avoid getting errors about
|
|
* bad prototypes... */
|
|
|
|
asm("
|
|
.globl ppcFuncTable
|
|
.section \".rodata\"
|
|
.align 2
|
|
.type ppcFuncTable,@object
|
|
ppcFuncTable:"
|
|
|
|
#define obsolete29 obsolete
|
|
#define obsolete30 obsolete
|
|
#define obsolete31 obsolete
|
|
#define obsolete32 obsolete
|
|
#define obsolete33 obsolete
|
|
#define obsolete34 obsolete
|
|
#define obsolete35 obsolete
|
|
#define obsolete36 obsolete
|
|
#define obsolete37 obsolete
|
|
#define obsolete40 obsolete
|
|
#define obsolete41 obsolete
|
|
#define obsolete47 obsolete
|
|
#define obsolete56 obsolete
|
|
#define obsolete57 obsolete
|
|
#define obsolete58 obsolete
|
|
#define obsolete59 obsolete
|
|
#define obsolete74 obsolete
|
|
#define obsolete75 obsolete
|
|
#define obsolete76 obsolete
|
|
#define obsolete77 obsolete
|
|
#define obsolete78 obsolete
|
|
#define obsolete79 obsolete
|
|
#define obsolete80 obsolete
|
|
#define obsolete81 obsolete
|
|
#define obsolete82 obsolete
|
|
#define obsolete83 obsolete
|
|
#define obsolete84 obsolete
|
|
#define obsolete95 obsolete
|
|
#define obsolete96 obsolete
|
|
#define obsolete97 obsolete
|
|
#define obsolete98 obsolete
|
|
#define obsolete99 obsolete
|
|
#define obsolete100 obsolete
|
|
#define obsolete102 obsolete
|
|
#ifdef TRACE_LIBRARY
|
|
#define SYSTEM_CALL(func, vec, nargs) ".long " STR(_trace_ ## func) "\n"
|
|
#else
|
|
#define SYSTEM_CALL(func, vec, nargs) ".long " STR(func) "\n"
|
|
#endif
|
|
#include <sys/ixnet_syscall.def>
|
|
#undef SYSTEM_CALL
|
|
|
|
"endppcFuncTable:
|
|
.size ppcFuncTable,endppcFuncTable-ppcFuncTable
|
|
");
|
|
|
|
|