File:  [DVB] / dietlibc / mips / clone.S
Revision 1.7: download - view: text, annotated - select for diffs
Mon Jun 6 11:59:21 2016 UTC (8 years ago) by leitner
Branches: MAIN
CVS tags: HEAD
  mips64 little endian port (Christian Seiler)

#include <errno.h>
#include "syscalls.h"
#include "mips-asm.h"

.text
.align 2
.global __clone
.ent	__clone
.type __clone,@function
__clone:
	.set noreorder
	.cpload $25
	.set reorder
#if _MIPS_SIM == _ABI64
	dsubu	$29,$29,64
#else
	subu	$29,$29,32
#endif
	.cprestore 16

	li	$2, EINVAL
	beqz	$4, .Lerror
	beqz	$5, .Lerror

#if _MIPS_SIM == _ABI64
	dsubu	$5, $5, 64	/* resterve some space */
	sd	$4, 0($5)	/* save function pointer */
	sd	$7, 8($5)	/* save arg pointer */
#else
	subu	$5, $5, 32	/* resterve some space */
	sw	$4, 0($5)	/* save function pointer */
	sw	$7, 4($5)	/* save arg pointer */
#endif

	move	$4, $6
	li	$2, __NR_clone
	syscall

	bnez	$7, .Lerror
	beqz	$2, .Lstart

#if _MIPS_SIM == _ABI64
	daddu	$29,$29,64	/* free stack */
#else
	addu	$29,$29,32	/* free stack */
#endif
	jr	$31

.Lerror:
	PTR_LA	$25, error_unified_syscall
	jr	$25

.Lstart:
#if _MIPS_SIM == _ABI64
	ld	$28,32($29)
	ld	$25, 0($29)
	ld	$4,  8($29)
#else
	lw	$28,16($29)
	lw	$25, 0($29)
	lw	$4,  4($29)
#endif
	jalr	$25
	move	$4, $2
	jal	_exit

.end	__clone

LinuxTV legacy CVS <linuxtv.org/cvs>