mirror of https://github.com/deadw00d/AROS.git
Refactor: move exec code to separate file
This commit is contained in:
parent
8bc73d53b0
commit
db89fa1762
|
@ -4,27 +4,13 @@
|
|||
#include <proto/timer.h>
|
||||
|
||||
#include <proto/dos.h>
|
||||
#include <proto/exec.h>
|
||||
#include <proto/intuition.h>
|
||||
#include <proto/graphics.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "abiv0/include/exec/functions.h"
|
||||
#include "abiv0/include/aros/proxy.h"
|
||||
#include "abiv0/include/aros/cpu.h"
|
||||
#include "abiv0/include/dos/structures.h"
|
||||
#include "abiv0/include/timer/structures.h"
|
||||
#include "abiv0/include/intuition/structures.h"
|
||||
#include "abiv0/include/utility/structures.h"
|
||||
#include "abiv0/include/graphics/proxy_structures.h"
|
||||
|
||||
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
|
||||
|
||||
extern struct DosLibraryV0 *abiv0DOSBase;
|
||||
struct LibraryV0 *abiv0TimerBase;
|
||||
struct ExecBaseV0 *abiv0SysBase;
|
||||
extern struct ExecBaseV0 *abiv0SysBase;
|
||||
|
||||
struct LibraryV0 *shallow_InitResident32(struct ResidentV0 *resident, BPTR segList, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
|
@ -64,282 +50,12 @@ asm("int3");
|
|||
return library;
|
||||
} /* shallow_InitResident32 */
|
||||
|
||||
|
||||
APTR abiv0_AllocMem(ULONG byteSize, ULONG requirements, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocMem(byteSize, requirements | MEMF_31BIT);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocMem)
|
||||
|
||||
APTR abiv0_AllocAbs(ULONG byteSize, APTR location, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocAbs)
|
||||
|
||||
void abiv0_FreeMem(APTR memoryBlock, ULONG byteSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return FreeMem(memoryBlock, byteSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(FreeMem)
|
||||
|
||||
APTR abiv0_AllocVec(ULONG byteSize, ULONG requirements, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocVec(byteSize, requirements | MEMF_31BIT);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocVec)
|
||||
|
||||
void abiv0_FreeVec(APTR memoryBlock, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
FreeVec(memoryBlock);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(FreeVec)
|
||||
|
||||
APTR abiv0_CreatePool(ULONG requirements, ULONG puddleSize, ULONG threshSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return CreatePool(requirements | MEMF_31BIT, puddleSize, threshSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(CreatePool)
|
||||
|
||||
APTR abiv0_AllocPooled(APTR poolHeader, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocPooled(poolHeader, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocPooled)
|
||||
|
||||
void abiv0_FreePooled(APTR poolHeader, APTR memory, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
FreePooled(poolHeader, memory, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(FreePooled)
|
||||
|
||||
APTR abiv0_AllocVecPooled(APTR poolHeader, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocVecPooled(poolHeader, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocVecPooled)
|
||||
|
||||
ULONG abiv0_TypeOfMem(APTR address, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return TypeOfMem(address);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(TypeOfMem)
|
||||
|
||||
VOID abiv0_Forbid(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
Forbid();
|
||||
}
|
||||
MAKE_PROXY_ARG_1(Forbid)
|
||||
|
||||
VOID abiv0_Permit(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
Permit();
|
||||
}
|
||||
MAKE_PROXY_ARG_1(Permit)
|
||||
|
||||
VOID abiv0_AddMemHandler(APTR memHandler, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_AddMemHandler ignored\n");
|
||||
}
|
||||
MAKE_PROXY_ARG_2(AddMemHandler)
|
||||
|
||||
struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name)
|
||||
{
|
||||
/* we may not have any extension fields */
|
||||
const int sizeofresident = offsetof(struct ResidentV0, rt_Init) + sizeof(APTR);
|
||||
|
||||
while(seg)
|
||||
{
|
||||
STRPTR addr = (STRPTR)((IPTR)BADDR(seg) - sizeof(ULONG));
|
||||
ULONG size = *(ULONG *)addr;
|
||||
|
||||
for(
|
||||
addr += sizeof(BPTR) + sizeof(ULONG),
|
||||
size -= sizeof(BPTR) + sizeof(ULONG);
|
||||
size >= sizeofresident;
|
||||
size -= 2, addr += 2
|
||||
)
|
||||
{
|
||||
struct ResidentV0 *res = (struct ResidentV0 *)addr;
|
||||
if( res->rt_MatchWord == RTC_MATCHWORD
|
||||
&& res->rt_MatchTag == (APTR32)(IPTR)res )
|
||||
{
|
||||
if ((name != NULL) && (strcmp((char *)(IPTR)res->rt_Name, name) != 0))
|
||||
continue;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
seg = *(BPTR *)BADDR(seg);
|
||||
}
|
||||
}
|
||||
|
||||
APTR abiv0_DOS_OpenLibrary(CONST_STRPTR name, ULONG version, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_OpenLibrary: %s\n", name);
|
||||
TEXT buff[64];
|
||||
struct LibraryV0 *_ret;
|
||||
|
||||
/* Special case */
|
||||
if (strcmp(name, "dos.library") == 0)
|
||||
return abiv0DOSBase;
|
||||
|
||||
/* Call Exec function, maybe the library is already available */
|
||||
_ret = abiv0_OpenLibrary(name, version, SysBaseV0);
|
||||
if (_ret)
|
||||
return _ret;
|
||||
|
||||
/* Try loading from disk */
|
||||
sprintf(buff, "SYS:Libs32/%s", name);
|
||||
|
||||
BPTR seglist = LoadSeg32(buff, DOSBase);
|
||||
|
||||
if (seglist == BNULL)
|
||||
return NULL;
|
||||
|
||||
struct ResidentV0 *res = findResident(seglist, NULL);
|
||||
|
||||
if (res)
|
||||
{
|
||||
(bug("[LDInit] Calling InitResident(%p) on %s\n", res, res->rt_Name));
|
||||
/* AOS compatibility requirement.
|
||||
* Ramlib ignores InitResident() return code.
|
||||
* After InitResident() it checks if lib/dev appeared
|
||||
* in Exec lib/dev list via FindName().
|
||||
*
|
||||
* Evidently InitResident()'s return code was not
|
||||
* reliable for some early AOS libraries.
|
||||
*/
|
||||
// Forbid();
|
||||
abiv0_InitResident(res, seglist, SysBaseV0);
|
||||
_ret = abiv0_OpenLibrary(name, version, SysBaseV0);
|
||||
// Permit();
|
||||
(bug("[LDInit] Done calling InitResident(%p) on %s, seg %p, node %p\n", res, res->rt_Name, BADDR(seglist), _ret));
|
||||
|
||||
return _ret;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void proxy_OpenLibrary();
|
||||
void dummy_OpenLibrary()
|
||||
{
|
||||
EXTER_PROXY(OpenLibrary)
|
||||
ENTER64
|
||||
COPY_ARG_1
|
||||
COPY_ARG_2
|
||||
COPY_ARG_3
|
||||
CALL_IMPL64(DOS_OpenLibrary)
|
||||
ENTER32
|
||||
LEAVE_PROXY
|
||||
}
|
||||
|
||||
void abiv0_CloseLibrary()
|
||||
{
|
||||
}
|
||||
MAKE_PROXY_ARG_2(CloseLibrary)
|
||||
|
||||
ULONG abiv0_AllocTaskStorageSlot()
|
||||
{
|
||||
return AllocTaskStorageSlot();
|
||||
}
|
||||
MAKE_PROXY_ARG_2(AllocTaskStorageSlot)
|
||||
|
||||
BOOL abiv0_SetTaskStorageSlot(LONG slot, ULONG value)
|
||||
{
|
||||
return SetTaskStorageSlot(slot, value);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(SetTaskStorageSlot)
|
||||
|
||||
ULONG abiv0_GetTaskStorageSlot(LONG id)
|
||||
{
|
||||
return GetTaskStorageSlot(id);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(GetTaskStorageSlot)
|
||||
|
||||
APTR abiv0_OpenResource(CONST_STRPTR resName)
|
||||
{
|
||||
if (strcmp(resName, "kernel.resource") == 0)
|
||||
return NULL;
|
||||
|
||||
asm("int3");
|
||||
return (APTR)0x1;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(OpenResource)
|
||||
|
||||
LONG abiv0_OpenDevice(CONST_STRPTR devName, ULONG unitNumber, struct IORequestV0 *iORequest)
|
||||
{
|
||||
if (strcmp(devName, "timer.device") == 0)
|
||||
{
|
||||
iORequest->io_Device = (APTR32)(IPTR)abiv0TimerBase;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(devName, "input.device") == 0)
|
||||
{
|
||||
bug("abiv0_OpenDevice: input.device STUB\n");
|
||||
iORequest->io_Device = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
asm("int3");
|
||||
return 0;
|
||||
}
|
||||
MAKE_PROXY_ARG_4(OpenDevice)
|
||||
|
||||
struct MsgPortV0 * abiv0_CreateMsgPort(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_CreateMsgPort: STUB\n");
|
||||
return (struct MsgPortV0 *)0x6;
|
||||
}
|
||||
MAKE_PROXY_ARG_1(CreateMsgPort)
|
||||
|
||||
LONG abiv0_DoIO(struct IORequestV0 *IORequest, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_DoIO: STUB\n");
|
||||
return 0;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(DoIO)
|
||||
|
||||
|
||||
MAKE_PROXY_ARG_6(MakeLibrary)
|
||||
MAKE_PROXY_ARG_2(AddResource)
|
||||
|
||||
void abiv0_CopyMem(APTR source, APTR dest, ULONG size)
|
||||
{
|
||||
return CopyMem(source, dest, size);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(CopyMem)
|
||||
|
||||
|
||||
struct LibraryV0 *abiv0_Layers_OpenLib(ULONG version, struct LibraryV0 *LayersBaseV0)
|
||||
{
|
||||
return LayersBaseV0;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(Layers_OpenLib)
|
||||
|
||||
APTR makeFileHandleProxy(BPTR);
|
||||
|
||||
struct TaskV0 *abiv0_FindTask(CONST_STRPTR name, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
static struct ProcessV0 *dummy = NULL;
|
||||
if (dummy == NULL) dummy = abiv0_AllocMem(sizeof(struct ProcessV0), MEMF_CLEAR, SysBaseV0);
|
||||
dummy->pr_Task.tc_Node.ln_Type = NT_PROCESS;
|
||||
dummy->pr_Task.tc_Node.ln_Name = (APTR32)(IPTR)abiv0_AllocMem(10, MEMF_CLEAR, SysBaseV0);
|
||||
strcpy((char *)(IPTR)dummy->pr_Task.tc_Node.ln_Name, "emulator");
|
||||
dummy->pr_CLI = (BPTR32)(IPTR)abiv0_AllocMem(sizeof(struct CommandLineInterfaceV0), MEMF_CLEAR, SysBaseV0);
|
||||
dummy->pr_CIS = (BPTR32)(IPTR)makeFileHandleProxy(Input());
|
||||
dummy->pr_CES = 0x2; //fake
|
||||
dummy->pr_COS = (BPTR32)(IPTR)makeFileHandleProxy(Output());
|
||||
dummy->pr_HomeDir = (BPTR32)(IPTR)makeFileHandleProxy(GetProgramDir());
|
||||
|
||||
|
||||
return (struct TaskV0 *)dummy;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(FindTask)
|
||||
|
||||
void abiv0_GetSysTime(struct timeval *dest, struct LibraryV0 *TimerBaseV0)
|
||||
{
|
||||
return GetSysTime(dest);
|
||||
|
@ -347,23 +63,13 @@ void abiv0_GetSysTime(struct timeval *dest, struct LibraryV0 *TimerBaseV0)
|
|||
MAKE_PROXY_ARG_2(GetSysTime)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ULONG *execfunctable;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
APTR32 global_SysBaseV0Ptr;
|
||||
|
||||
extern ULONG *seginitlist;
|
||||
extern ULONG* segclassesinitlist;
|
||||
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
|
||||
struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name);
|
||||
|
||||
void init_graphics();
|
||||
void init_intuition();
|
||||
void init_dos();
|
||||
void init_exec();
|
||||
|
||||
LONG_FUNC run_emulation()
|
||||
{
|
||||
|
@ -374,65 +80,12 @@ LONG_FUNC run_emulation()
|
|||
/* Set start at first instruction (skip Seg header) */
|
||||
start = (APTR)((IPTR)start + 13);
|
||||
|
||||
APTR tmp;
|
||||
init_exec();
|
||||
|
||||
tmp = AllocMem(2048, MEMF_31BIT | MEMF_CLEAR);
|
||||
abiv0SysBase = (tmp + 1024);
|
||||
global_SysBaseV0Ptr = (APTR32)(IPTR)&abiv0SysBase; /* Needed for LoadSeg32 to resolve SysBase in kernel */
|
||||
|
||||
/* Keep it! This fills global variable */
|
||||
LoadSeg32("SYS:Libs32/partial/kernel", DOSBase);
|
||||
|
||||
NEWLISTV0(&abiv0SysBase->LibList);
|
||||
NEWLISTV0(&abiv0SysBase->ResourceList);
|
||||
abiv0SysBase->LibNode.lib_Version = 51;
|
||||
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 92, (APTR32)(IPTR)proxy_OpenLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 69, (APTR32)(IPTR)proxy_CloseLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 49, (APTR32)(IPTR)proxy_FindTask);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,180, (APTR32)(IPTR)proxy_AllocTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,184, (APTR32)(IPTR)proxy_SetTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,185, (APTR32)(IPTR)proxy_GetTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 83, (APTR32)(IPTR)proxy_OpenResource);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 93, execfunctable[92]); // InitSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 33, (APTR32)(IPTR)proxy_AllocMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 14, (APTR32)(IPTR)proxy_MakeLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,104, (APTR32)(IPTR)proxy_CopyMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,116, (APTR32)(IPTR)proxy_CreatePool);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 74, (APTR32)(IPTR)proxy_OpenDevice);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,118, (APTR32)(IPTR)proxy_AllocPooled);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,114, (APTR32)(IPTR)proxy_AllocVec);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 46, execfunctable[45]); // FindName
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,135, execfunctable[134]); // TaggedOpenLibrary
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 89, (APTR32)(IPTR)proxy_TypeOfMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 41, execfunctable[40]); // AddTail
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 87, execfunctable[86]); // RawDoFmt
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 35, (APTR32)(IPTR)proxy_FreeMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,113, execfunctable[112]); // ObtainSemaphoreShared
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 94, execfunctable[93]); // ObtainSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 40, execfunctable[39]); // AddHead
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 95, execfunctable[94]); // ReleaseSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 81, (APTR32)(IPTR)proxy_AddResource);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 22, (APTR32)(IPTR)proxy_Forbid);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 23, (APTR32)(IPTR)proxy_Permit);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,129, (APTR32)(IPTR)proxy_AddMemHandler);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 70, execfunctable[69]); // SetFunction
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 71, execfunctable[70]); // SumLibrary
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 45, execfunctable[44]); // Enqueue
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 34, (APTR32)(IPTR)proxy_AllocAbs);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,115, (APTR32)(IPTR)proxy_FreeVec);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,111, (APTR32)(IPTR)proxy_CreateMsgPort);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,109, execfunctable[108]); // CreateIORequest
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 42, execfunctable[41]); // Remove
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,149, (APTR32)(IPTR)proxy_AllocVecPooled);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 76, (APTR32)(IPTR)proxy_DoIO);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,119, (APTR32)(IPTR)proxy_FreePooled);
|
||||
|
||||
tmp = AllocMem(1024, MEMF_31BIT | MEMF_CLEAR);
|
||||
APTR tmp = AllocMem(1024, MEMF_31BIT | MEMF_CLEAR);
|
||||
abiv0TimerBase = (tmp + 512);
|
||||
__AROS_SETVECADDRV0(abiv0TimerBase, 11, (APTR32)(IPTR)proxy_GetSysTime);
|
||||
|
||||
|
||||
init_dos();
|
||||
|
||||
BPTR cgfxseg = LoadSeg32("SYS:Libs32/partial/cybergraphics.library", DOSBase);
|
||||
|
|
|
@ -252,9 +252,7 @@ bug("abiv0_IoErr: STUB\n");
|
|||
}
|
||||
MAKE_PROXY_ARG_1(IoErr)
|
||||
|
||||
// struct LibraryV0 *shallow_InitResident32(struct ResidentV0 *resident, BPTR segList, struct ExecBaseV0 *SysBaseV0);
|
||||
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
|
||||
// struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name);
|
||||
APTR abiv0_DOS_OpenLibrary(CONST_STRPTR name, ULONG version, struct ExecBaseV0 *SysBaseV0);
|
||||
|
||||
extern ULONG *dosfunctable;
|
||||
|
|
|
@ -0,0 +1,347 @@
|
|||
#include <proto/exec.h>
|
||||
#include <proto/dos.h>
|
||||
#include <aros/debug.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../include/exec/structures.h"
|
||||
#include "../include/exec/functions.h"
|
||||
#include "../include/aros/cpu.h"
|
||||
#include "../include/aros/proxy.h"
|
||||
|
||||
#include "../include/dos/structures.h"
|
||||
|
||||
extern struct DosLibraryV0 *abiv0DOSBase;
|
||||
struct ExecBaseV0 *abiv0SysBase;
|
||||
extern struct LibraryV0 *abiv0TimerBase;
|
||||
|
||||
APTR abiv0_AllocMem(ULONG byteSize, ULONG requirements, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocMem(byteSize, requirements | MEMF_31BIT);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocMem)
|
||||
|
||||
APTR abiv0_AllocAbs(ULONG byteSize, APTR location, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocAbs)
|
||||
|
||||
void abiv0_FreeMem(APTR memoryBlock, ULONG byteSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return FreeMem(memoryBlock, byteSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(FreeMem)
|
||||
|
||||
APTR abiv0_AllocVec(ULONG byteSize, ULONG requirements, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocVec(byteSize, requirements | MEMF_31BIT);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocVec)
|
||||
|
||||
void abiv0_FreeVec(APTR memoryBlock, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
FreeVec(memoryBlock);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(FreeVec)
|
||||
|
||||
APTR abiv0_CreatePool(ULONG requirements, ULONG puddleSize, ULONG threshSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return CreatePool(requirements | MEMF_31BIT, puddleSize, threshSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(CreatePool)
|
||||
|
||||
APTR abiv0_AllocPooled(APTR poolHeader, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocPooled(poolHeader, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocPooled)
|
||||
|
||||
void abiv0_FreePooled(APTR poolHeader, APTR memory, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
FreePooled(poolHeader, memory, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(FreePooled)
|
||||
|
||||
APTR abiv0_AllocVecPooled(APTR poolHeader, ULONG memSize, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return AllocVecPooled(poolHeader, memSize);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(AllocVecPooled)
|
||||
|
||||
ULONG abiv0_TypeOfMem(APTR address, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
return TypeOfMem(address);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(TypeOfMem)
|
||||
|
||||
VOID abiv0_Forbid(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
Forbid();
|
||||
}
|
||||
MAKE_PROXY_ARG_1(Forbid)
|
||||
|
||||
VOID abiv0_Permit(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
Permit();
|
||||
}
|
||||
MAKE_PROXY_ARG_1(Permit)
|
||||
|
||||
VOID abiv0_AddMemHandler(APTR memHandler, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_AddMemHandler ignored\n");
|
||||
}
|
||||
MAKE_PROXY_ARG_2(AddMemHandler)
|
||||
|
||||
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
|
||||
|
||||
struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name)
|
||||
{
|
||||
/* we may not have any extension fields */
|
||||
const int sizeofresident = offsetof(struct ResidentV0, rt_Init) + sizeof(APTR);
|
||||
|
||||
while(seg)
|
||||
{
|
||||
STRPTR addr = (STRPTR)((IPTR)BADDR(seg) - sizeof(ULONG));
|
||||
ULONG size = *(ULONG *)addr;
|
||||
|
||||
for(
|
||||
addr += sizeof(BPTR) + sizeof(ULONG),
|
||||
size -= sizeof(BPTR) + sizeof(ULONG);
|
||||
size >= sizeofresident;
|
||||
size -= 2, addr += 2
|
||||
)
|
||||
{
|
||||
struct ResidentV0 *res = (struct ResidentV0 *)addr;
|
||||
if( res->rt_MatchWord == RTC_MATCHWORD
|
||||
&& res->rt_MatchTag == (APTR32)(IPTR)res )
|
||||
{
|
||||
if ((name != NULL) && (strcmp((char *)(IPTR)res->rt_Name, name) != 0))
|
||||
continue;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
seg = *(BPTR *)BADDR(seg);
|
||||
}
|
||||
}
|
||||
|
||||
APTR abiv0_DOS_OpenLibrary(CONST_STRPTR name, ULONG version, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_OpenLibrary: %s\n", name);
|
||||
TEXT buff[64];
|
||||
struct LibraryV0 *_ret;
|
||||
|
||||
/* Special case */
|
||||
if (strcmp(name, "dos.library") == 0)
|
||||
return abiv0DOSBase;
|
||||
|
||||
/* Call Exec function, maybe the library is already available */
|
||||
_ret = abiv0_OpenLibrary(name, version, SysBaseV0);
|
||||
if (_ret)
|
||||
return _ret;
|
||||
|
||||
/* Try loading from disk */
|
||||
sprintf(buff, "SYS:Libs32/%s", name);
|
||||
|
||||
BPTR seglist = LoadSeg32(buff, DOSBase);
|
||||
|
||||
if (seglist == BNULL)
|
||||
return NULL;
|
||||
|
||||
struct ResidentV0 *res = findResident(seglist, NULL);
|
||||
|
||||
if (res)
|
||||
{
|
||||
(bug("[LDInit] Calling InitResident(%p) on %s\n", res, res->rt_Name));
|
||||
/* AOS compatibility requirement.
|
||||
* Ramlib ignores InitResident() return code.
|
||||
* After InitResident() it checks if lib/dev appeared
|
||||
* in Exec lib/dev list via FindName().
|
||||
*
|
||||
* Evidently InitResident()'s return code was not
|
||||
* reliable for some early AOS libraries.
|
||||
*/
|
||||
// Forbid();
|
||||
abiv0_InitResident(res, seglist, SysBaseV0);
|
||||
_ret = abiv0_OpenLibrary(name, version, SysBaseV0);
|
||||
// Permit();
|
||||
(bug("[LDInit] Done calling InitResident(%p) on %s, seg %p, node %p\n", res, res->rt_Name, BADDR(seglist), _ret));
|
||||
|
||||
return _ret;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void proxy_OpenLibrary();
|
||||
void dummy_OpenLibrary()
|
||||
{
|
||||
EXTER_PROXY(OpenLibrary)
|
||||
ENTER64
|
||||
COPY_ARG_1
|
||||
COPY_ARG_2
|
||||
COPY_ARG_3
|
||||
CALL_IMPL64(DOS_OpenLibrary)
|
||||
ENTER32
|
||||
LEAVE_PROXY
|
||||
}
|
||||
|
||||
void abiv0_CloseLibrary()
|
||||
{
|
||||
}
|
||||
MAKE_PROXY_ARG_2(CloseLibrary)
|
||||
|
||||
ULONG abiv0_AllocTaskStorageSlot()
|
||||
{
|
||||
return AllocTaskStorageSlot();
|
||||
}
|
||||
MAKE_PROXY_ARG_2(AllocTaskStorageSlot)
|
||||
|
||||
BOOL abiv0_SetTaskStorageSlot(LONG slot, ULONG value)
|
||||
{
|
||||
return SetTaskStorageSlot(slot, value);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(SetTaskStorageSlot)
|
||||
|
||||
ULONG abiv0_GetTaskStorageSlot(LONG id)
|
||||
{
|
||||
return GetTaskStorageSlot(id);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(GetTaskStorageSlot)
|
||||
|
||||
APTR abiv0_OpenResource(CONST_STRPTR resName)
|
||||
{
|
||||
if (strcmp(resName, "kernel.resource") == 0)
|
||||
return NULL;
|
||||
|
||||
asm("int3");
|
||||
return (APTR)0x1;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(OpenResource)
|
||||
|
||||
LONG abiv0_OpenDevice(CONST_STRPTR devName, ULONG unitNumber, struct IORequestV0 *iORequest)
|
||||
{
|
||||
if (strcmp(devName, "timer.device") == 0)
|
||||
{
|
||||
iORequest->io_Device = (APTR32)(IPTR)abiv0TimerBase;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strcmp(devName, "input.device") == 0)
|
||||
{
|
||||
bug("abiv0_OpenDevice: input.device STUB\n");
|
||||
iORequest->io_Device = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
asm("int3");
|
||||
return 0;
|
||||
}
|
||||
MAKE_PROXY_ARG_4(OpenDevice)
|
||||
|
||||
struct MsgPortV0 * abiv0_CreateMsgPort(struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_CreateMsgPort: STUB\n");
|
||||
return (struct MsgPortV0 *)0x6;
|
||||
}
|
||||
MAKE_PROXY_ARG_1(CreateMsgPort)
|
||||
|
||||
LONG abiv0_DoIO(struct IORequestV0 *IORequest, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
bug("abiv0_DoIO: STUB\n");
|
||||
return 0;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(DoIO)
|
||||
|
||||
|
||||
MAKE_PROXY_ARG_6(MakeLibrary)
|
||||
MAKE_PROXY_ARG_2(AddResource)
|
||||
|
||||
void abiv0_CopyMem(APTR source, APTR dest, ULONG size)
|
||||
{
|
||||
return CopyMem(source, dest, size);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(CopyMem)
|
||||
|
||||
APTR makeFileHandleProxy(BPTR);
|
||||
|
||||
struct TaskV0 *abiv0_FindTask(CONST_STRPTR name, struct ExecBaseV0 *SysBaseV0)
|
||||
{
|
||||
static struct ProcessV0 *dummy = NULL;
|
||||
if (dummy == NULL) dummy = abiv0_AllocMem(sizeof(struct ProcessV0), MEMF_CLEAR, SysBaseV0);
|
||||
dummy->pr_Task.tc_Node.ln_Type = NT_PROCESS;
|
||||
dummy->pr_Task.tc_Node.ln_Name = (APTR32)(IPTR)abiv0_AllocMem(10, MEMF_CLEAR, SysBaseV0);
|
||||
strcpy((char *)(IPTR)dummy->pr_Task.tc_Node.ln_Name, "emulator");
|
||||
dummy->pr_CLI = (BPTR32)(IPTR)abiv0_AllocMem(sizeof(struct CommandLineInterfaceV0), MEMF_CLEAR, SysBaseV0);
|
||||
dummy->pr_CIS = (BPTR32)(IPTR)makeFileHandleProxy(Input());
|
||||
dummy->pr_CES = 0x2; //fake
|
||||
dummy->pr_COS = (BPTR32)(IPTR)makeFileHandleProxy(Output());
|
||||
dummy->pr_HomeDir = (BPTR32)(IPTR)makeFileHandleProxy(GetProgramDir());
|
||||
|
||||
|
||||
return (struct TaskV0 *)dummy;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(FindTask)
|
||||
|
||||
extern ULONG *execfunctable;
|
||||
APTR32 global_SysBaseV0Ptr;
|
||||
|
||||
void init_exec()
|
||||
{
|
||||
APTR tmp;
|
||||
|
||||
tmp = AllocMem(2048, MEMF_31BIT | MEMF_CLEAR);
|
||||
abiv0SysBase = (tmp + 1024);
|
||||
global_SysBaseV0Ptr = (APTR32)(IPTR)&abiv0SysBase; /* Needed for LoadSeg32 to resolve SysBase in kernel */
|
||||
|
||||
/* Keep it! This fills global variable */
|
||||
LoadSeg32("SYS:Libs32/partial/kernel", DOSBase);
|
||||
|
||||
NEWLISTV0(&abiv0SysBase->LibList);
|
||||
NEWLISTV0(&abiv0SysBase->ResourceList);
|
||||
abiv0SysBase->LibNode.lib_Version = 51;
|
||||
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 92, (APTR32)(IPTR)proxy_OpenLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 69, (APTR32)(IPTR)proxy_CloseLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 49, (APTR32)(IPTR)proxy_FindTask);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,180, (APTR32)(IPTR)proxy_AllocTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,184, (APTR32)(IPTR)proxy_SetTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,185, (APTR32)(IPTR)proxy_GetTaskStorageSlot);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 83, (APTR32)(IPTR)proxy_OpenResource);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 93, execfunctable[92]); // InitSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 33, (APTR32)(IPTR)proxy_AllocMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 14, (APTR32)(IPTR)proxy_MakeLibrary);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,104, (APTR32)(IPTR)proxy_CopyMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,116, (APTR32)(IPTR)proxy_CreatePool);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 74, (APTR32)(IPTR)proxy_OpenDevice);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,118, (APTR32)(IPTR)proxy_AllocPooled);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,114, (APTR32)(IPTR)proxy_AllocVec);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 46, execfunctable[45]); // FindName
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,135, execfunctable[134]); // TaggedOpenLibrary
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 89, (APTR32)(IPTR)proxy_TypeOfMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 41, execfunctable[40]); // AddTail
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 87, execfunctable[86]); // RawDoFmt
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 35, (APTR32)(IPTR)proxy_FreeMem);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,113, execfunctable[112]); // ObtainSemaphoreShared
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 94, execfunctable[93]); // ObtainSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 40, execfunctable[39]); // AddHead
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 95, execfunctable[94]); // ReleaseSemaphore
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 81, (APTR32)(IPTR)proxy_AddResource);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 22, (APTR32)(IPTR)proxy_Forbid);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 23, (APTR32)(IPTR)proxy_Permit);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,129, (APTR32)(IPTR)proxy_AddMemHandler);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 70, execfunctable[69]); // SetFunction
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 71, execfunctable[70]); // SumLibrary
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 45, execfunctable[44]); // Enqueue
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 34, (APTR32)(IPTR)proxy_AllocAbs);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,115, (APTR32)(IPTR)proxy_FreeVec);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,111, (APTR32)(IPTR)proxy_CreateMsgPort);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,109, execfunctable[108]); // CreateIORequest
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 42, execfunctable[41]); // Remove
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,149, (APTR32)(IPTR)proxy_AllocVecPooled);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 76, (APTR32)(IPTR)proxy_DoIO);
|
||||
__AROS_SETVECADDRV0(abiv0SysBase,119, (APTR32)(IPTR)proxy_FreePooled);
|
||||
}
|
|
@ -303,6 +303,7 @@ static int __attribute__ ((noinline)) load_hunk
|
|||
ULONG *segclassesinitlist;
|
||||
ULONG *seginitlist;
|
||||
ULONG *dosfunctable;
|
||||
ULONG *execfunctable;
|
||||
|
||||
static int relocate
|
||||
(
|
||||
|
@ -399,7 +400,6 @@ static int relocate
|
|||
/* UGLY HACK TO GET FUNC TABLE OF EXEC AND DOS*/
|
||||
if ((name[0] == 'E') && (strcmp(name, "Exec_FuncTable") == 0))
|
||||
{
|
||||
extern ULONG *execfunctable;
|
||||
execfunctable = (APTR)(IPTR)s;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ FILES := AoA loadseg32 internalloadseg32 internalloadseg_elf32 internalloadseg_s
|
|||
abiv0/graphics/graphics_init \
|
||||
abiv0/intuition/intuition_init \
|
||||
abiv0/dos/dos_init \
|
||||
abiv0/exec/exec_init \
|
||||
|
||||
EXEDIR := $(AROS_C)
|
||||
USER_INCLUDES := -I$(SRCDIR)/rom/dos
|
||||
|
|
Loading…
Reference in New Issue