##
## ppc.library emulation
## (c)1998-99 Frank Wille <frank@phoenix.owl.de>
##
## PPC assembler stub for calling PowerUp kernel functions.
## Will be used by the "dynamic PowerUp kernel linker".
##
## V0.5c (20.03.1999) phx
##       Removed PPCAlert(), PPCPutMessage() and PSYSCALL_xxx(),
##       which are not accessible in the original kernel.
## V0.4  (27.11.1998) phx
##       Included all kernel symbols of ppc.library V46.19,
##       except _KERNEL_xxxxx.
##       Rework of _kernel_entry:
##        r2 is initialized as TOC pointer, PPCLibBase is saved on stack.
##        Save and restore r2 (although not used under SVR4-ABI).
## V0.1  (15.11.1998) phx
##       First partially working ppc.library emulation. Synchronous PPC
##       tasks, started by runelf, which only use the basic PowerUp kernel
##       functions for I/O, memory and context-switch seem to work fine.
## V0.0  (13.11.1998) phx
##       created
##
	.file	"kernelcall.s"
	.include "warpos_lvo.i"


.set	PPCBIAS,(-450+2)
.macro	kern
	li	r11,PPCBIAS
	b	_kernel_entry
	.set	PPCBIAS,PPCBIAS-6
.endm

	.text

	.globl	_kernel_entry
_kernel_entry:
	mflr	r0
	stw	r0,4(r1)	# store LR in SVR4 stack
	stwu	r1,-64(r1)	# allocate PowerOpen stack for WarpOS
	lis	r12,0		# Offset 14: PPCLibBase@ha
	addi	r12,r12,0	# Offset 18: PPCLibBase@l
	stw	r2,56(r1)
	lwzx	r0,r12,r11
	lwz	r2,LinkerDB(r12)
	mtlr	r0
	stw	r12,60(r1)	# save PPCLibBase in kernel_entry stack frame
	blrl			# call kernel function in ppc.library
	lwz	r2,56(r1)
	lwz	r0,64+4(r1)	# restore LR, return to SVR4 ABI mode
	addi	r1,r1,64
	mtlr	r0
	blr


	.globl	_kernel_jumptab
_kernel_jumptab:
	kern	# PowerUPKernel/PPCAdd64
	kern	# PowerUPKernel/PPCAdd64p
	kern	# PowerUPKernel/PPCAddHead
	kern	# PowerUPKernel/PPCAddHeadSync
	kern	# PowerUPKernel/PPCAddPortList
	kern	# PowerUPKernel/PPCAddTail
	kern	# PowerUPKernel/PPCAddTailSync
	kern	# PowerUPKernel/PPCAllocMem
	kern	# PowerUPKernel/PPCAllocPooled
	kern	# PowerUPKernel/PPCAllocSignal
	kern	# PowerUPKernel/PPCAllocVec
	kern	# PowerUPKernel/PPCAllocVecPooled
	kern	# PowerUPKernel/PPCAnd64
	kern	# PowerUPKernel/PPCAnd64p
	kern	# PowerUPKernel/PPCAsl64
	kern	# PowerUPKernel/PPCAsl64p
	kern	# PowerUPKernel/PPCAsr64
	kern	# PowerUPKernel/PPCAsr64p
	kern	# PowerUPKernel/PPCAttemptSemaphore
	kern	# PowerUPKernel/PPCAttemptSemaphoreByName
	kern	# PowerUPKernel/PPCAttemptSemaphoreShared
	kern	# PowerUPKernel/PPCCacheFlush
	kern	# PowerUPKernel/PPCCacheFlushAll
	kern	# PowerUPKernel/PPCCacheInvalid
	kern	# PowerUPKernel/PPCCallM68k
	kern	# PowerUPKernel/PPCCallOS
	kern	# PowerUPKernel/PPCClose
	kern	# PowerUPKernel/PPCCloseLibrary
	kern	# PowerUPKernel/PPCCmp64
	kern	# PowerUPKernel/PPCCmp64p
	kern	# PowerUPKernel/PPCCoerceMethodA
	kern	# PowerUPKernel/PPCCreateMessage
	kern	# PowerUPKernel/PPCCreatePool
	kern	# PowerUPKernel/PPCCreatePort
	kern	# PowerUPKernel/PPCCreatePortList
	kern	# PowerUPKernel/PPCCreateSemaphore
	kern	# PowerUPKernel/PPCCreateTask
	kern	# PowerUPKernel/PPCCreateTimerObject
	kern	# PowerUPKernel/PPCDeleteMessage
	kern	# PowerUPKernel/PPCDeletePool
	kern	# PowerUPKernel/PPCDeletePort
	kern	# PowerUPKernel/PPCDeletePortList
	kern	# PowerUPKernel/PPCDeleteSemaphore
	kern	# PowerUPKernel/PPCDeleteTimerObject
	kern	# PowerUPKernel/PPCDivRem64
	kern	# PowerUPKernel/PPCDivRem64p
	kern	# PowerUPKernel/PPCDivs64
	kern	# PowerUPKernel/PPCDivs64p
	kern	# PowerUPKernel/PPCDivu64
	kern	# PowerUPKernel/PPCDivu64p
	kern	# PowerUPKernel/PPCDoMethodA
	kern	# PowerUPKernel/PPCDoSuperMethodA
	kern	# PowerUPKernel/PPCEnqueue
	kern	# PowerUPKernel/PPCEnqueueSync
	kern	# PowerUPKernel/PPCFindName
	kern	# PowerUPKernel/PPCFindNameSync
	kern	# PowerUPKernel/PPCFindTagItem
	kern	# PowerUPKernel/PPCFindTask
	kern	# PowerUPKernel/PPCFinishTask
	kern	# PowerUPKernel/PPCfprintf
	kern	# PowerUPKernel/PPCFreeMem
	kern	# PowerUPKernel/PPCFreePooled
	kern	# PowerUPKernel/PPCFreeSignal
	kern	# PowerUPKernel/PPCFreeVec
	kern	# PowerUPKernel/PPCFreeVecPooled
	kern	# PowerUPKernel/PPCGetAttr
	kern	# PowerUPKernel/PPCGetLibSymbol
	kern	# PowerUPKernel/PPCGetMessage
	kern	# PowerUPKernel/PPCGetMessageAttr
	kern	# PowerUPKernel/PPCGetObjectAttrs
	kern	# PowerUPKernel/PPCGetPortListAttr
	kern	# PowerUPKernel/PPCGetTagData
	kern	# PowerUPKernel/PPCGetTaskAttr
	kern	# PowerUPKernel/PPCGetTimerObject
	kern	# PowerUPKernel/PPCHandleTimerJobs
	kern	# PowerUPKernel/PPCInput
	kern	# PowerUPKernel/PPCInsert
	kern	# PowerUPKernel/PPCInsertSync
	kern	# PowerUPKernel/PPCkprintf
	kern	# PowerUPKernel/PPCLoadObject
	kern	# PowerUPKernel/PPCLoadObjectTagList
	kern	# PowerUPKernel/PPCLockBus
	kern	# PowerUPKernel/PPCLsl64
	kern	# PowerUPKernel/PPCLsl64p
	kern	# PowerUPKernel/PPCLsr64
	kern	# PowerUPKernel/PPCLsr64p
	kern	# PowerUPKernel/PPCMods64
	kern	# PowerUPKernel/PPCMods64p
	kern	# PowerUPKernel/PPCModu64
	kern	# PowerUPKernel/PPCModu64p
	kern	# PowerUPKernel/PPCMuls64
	kern	# PowerUPKernel/PPCMuls64p
	kern	# PowerUPKernel/PPCMulu64
	kern	# PowerUPKernel/PPCMulu64p
	kern	# PowerUPKernel/PPCNeg64
	kern	# PowerUPKernel/PPCNeg64p
	kern	# PowerUPKernel/PPCNewList
	kern	# PowerUPKernel/PPCNextTagItem
	kern	# PowerUPKernel/PPCObtainPort
	kern	# PowerUPKernel/PPCObtainSemaphore
	kern	# PowerUPKernel/PPCObtainSemaphoreByName
	kern	# PowerUPKernel/PPCObtainSemaphoreShared
	kern	# PowerUPKernel/PPCOpen
	kern	# PowerUPKernel/PPCOpenLibrary
	kern	# PowerUPKernel/PPCOr64
	kern	# PowerUPKernel/PPCOr64p
	kern	# PowerUPKernel/PPCOutput
	kern	# PowerUPKernel/PPCprintf
	kern	# PowerUPKernel/PPCRawDoFmt
	kern	# PowerUPKernel/PPCRead
	kern	# PowerUPKernel/PPCReadByte
	kern	# PowerUPKernel/PPCReadLong
	kern	# PowerUPKernel/PPCReadWord
	kern	# PowerUPKernel/PPCReleasePort
	kern	# PowerUPKernel/PPCReleaseSemaphore
	kern	# PowerUPKernel/PPCRemHead
	kern	# PowerUPKernel/PPCRemHeadSync
	kern	# PowerUPKernel/PPCRemove
	kern	# PowerUPKernel/PPCRemoveSync
	kern	# PowerUPKernel/PPCRemPortList
	kern	# PowerUPKernel/PPCRemTail
	kern	# PowerUPKernel/PPCRemTailSync
	kern	# PowerUPKernel/PPCReplyMessage
	kern	# PowerUPKernel/PPCRevision
	kern	# PowerUPKernel/PPCSeek
	kern	# PowerUPKernel/PPCSendMessage
	kern	# PowerUPKernel/PPCSetPortListAttr
	kern	# PowerUPKernel/PPCSetSignal
	kern	# PowerUPKernel/PPCSetTaskAttr
	kern	# PowerUPKernel/PPCSetTimerObject
	kern	# PowerUPKernel/PPCSignal
	kern	# PowerUPKernel/PPCsprintf
	kern	# PowerUPKernel/PPCSub64
	kern	# PowerUPKernel/PPCSub64p
	kern	# PowerUPKernel/PPCUnLoadObject
	kern	# PowerUPKernel/PPCUnLockBus
	kern	# PowerUPKernel/PPCVersion
	kern	# PowerUPKernel/PPCvfprintf
	kern	# PowerUPKernel/PPCvkprintf
	kern	# PowerUPKernel/PPCvprintf
	kern	# PowerUPKernel/PPCvsprintf
	kern	# PowerUPKernel/PPCWait
	kern	# PowerUPKernel/PPCWaitPort
	kern	# PowerUPKernel/PPCWaitPortList
	kern	# PowerUPKernel/PPCWrite
	kern	# PowerUPKernel/PPCWriteByte
	kern	# PowerUPKernel/PPCWriteLong
	kern	# PowerUPKernel/PPCWriteWord
	kern	# PowerUPKernel/PPCXor64
	kern	# PowerUPKernel/PPCXor64p
	kern	# PowerUPKernel/memcpy
	kern	# PowerUPKernel/strcmp
	kern	# PowerUPKernel/strcpy
	kern	# PowerUPKernel/strlen
	kern	# PowerUPKernel/__adddi3
	kern	# PowerUPKernel/__anddi3
	kern	# PowerUPKernel/__ashldi3
	kern	# PowerUPKernel/__ashrdi3
	kern	# PowerUPKernel/__cmpdi2
	kern	# PowerUPKernel/__divdi3
	kern	# PowerUPKernel/__fixdfdi
	kern	# PowerUPKernel/__fixsfdi
	kern	# PowerUPKernel/__fixunsdfdi
	kern	# PowerUPKernel/__fixunssfdi
	kern	# PowerUPKernel/__floatdidf
	kern	# PowerUPKernel/__floatdisf
	kern	# PowerUPKernel/__floatunsdidf
	kern	# PowerUPKernel/__iordi3
	kern	# PowerUPKernel/__lmulq
	kern	# PowerUPKernel/__lshldi3
	kern	# PowerUPKernel/__lshrdi3
	kern	# PowerUPKernel/__moddi3
	kern	# PowerUPKernel/__muldi3
	kern	# PowerUPKernel/__negdi2
	kern	# PowerUPKernel/__qdivrem
	kern	# PowerUPKernel/__subdi3
	kern	# PowerUPKernel/__ucmpdi2
	kern	# PowerUPKernel/__udivdi3
	kern	# PowerUPKernel/__umoddi3
	kern	# PowerUPKernel/__xordi3

	.globl	_kernel_jumptab_end
_kernel_jumptab_end:
