diff options
| author | Bobby Bingham <koorogi@koorogi.info> | 2016-04-30 19:18:17 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2016-05-08 22:57:40 -0400 | 
| commit | c0ede9e4046a0882d83ae4b45c7dfac86fb7c15d (patch) | |
| tree | 02956e3cc93a50bcc9c946fbc2bbffb883e72f2f /src/thread | |
| parent | 6bc7d9c411c3a32cfa9d239b73fffb2ba66dd9ff (diff) | |
| download | musl-c0ede9e4046a0882d83ae4b45c7dfac86fb7c15d.tar.gz | |
add powerpc64 port
Diffstat (limited to 'src/thread')
| -rw-r--r-- | src/thread/powerpc64/__set_thread_area.s | 8 | ||||
| -rw-r--r-- | src/thread/powerpc64/__unmapself.s | 9 | ||||
| -rw-r--r-- | src/thread/powerpc64/clone.s | 47 | ||||
| -rw-r--r-- | src/thread/powerpc64/syscall_cp.s | 37 | 
4 files changed, 101 insertions, 0 deletions
| diff --git a/src/thread/powerpc64/__set_thread_area.s b/src/thread/powerpc64/__set_thread_area.s new file mode 100644 index 00000000..9622826d --- /dev/null +++ b/src/thread/powerpc64/__set_thread_area.s @@ -0,0 +1,8 @@ +.text +.global __set_thread_area +.type   __set_thread_area, %function +__set_thread_area: +	mr 13, 3 +	li  3, 0 +	blr + diff --git a/src/thread/powerpc64/__unmapself.s b/src/thread/powerpc64/__unmapself.s new file mode 100644 index 00000000..c9360b47 --- /dev/null +++ b/src/thread/powerpc64/__unmapself.s @@ -0,0 +1,9 @@ +	.text +	.global __unmapself +	.type   __unmapself,%function +__unmapself: +	li      0, 91 # __NR_munmap +	sc +	li      0, 1 #__NR_exit +	sc +	blr diff --git a/src/thread/powerpc64/clone.s b/src/thread/powerpc64/clone.s new file mode 100644 index 00000000..03aa4468 --- /dev/null +++ b/src/thread/powerpc64/clone.s @@ -0,0 +1,47 @@ +.text +.global __clone +.type __clone, %function +__clone: +	# int clone(fn, stack, flags, arg, ptid, tls, ctid) +	#            a  b       c     d     e    f    g +	#            3  4       5     6     7    8    9 +	# pseudo C code: +	# tid = syscall(SYS_clone,c,b,e,f,g); +	# if (!tid) syscall(SYS_exit, a(d)); +	# return tid; + +	# create initial stack frame for new thread +	clrrdi 4, 4, 4 +	li     0, 0 +	stdu   0,-32(4) + +	# save fn and arg to child stack +	std    3,  8(4) +	std    6, 16(4) + +	# shuffle args into correct registers and call SYS_clone +	mr    3, 5 +	#mr   4, 4 +	mr    5, 7 +	mr    6, 8 +	mr    7, 9 +	li    0, 120  # SYS_clone = 120 +	sc + +	# if error, negate return (errno) +	bns+  1f +	neg   3, 3 + +1:	# if we're the parent, return +	cmpwi cr7, 3, 0 +	bnelr cr7 + +	# we're the child. call fn(arg) +	ld     3, 16(1) +	ld    12,  8(1) +	mtctr 12 +	bctrl + +	# call SYS_exit. exit code is already in r3 from fn return value +	li    0, 1    # SYS_exit = 1 +	sc diff --git a/src/thread/powerpc64/syscall_cp.s b/src/thread/powerpc64/syscall_cp.s new file mode 100644 index 00000000..d420dbde --- /dev/null +++ b/src/thread/powerpc64/syscall_cp.s @@ -0,0 +1,37 @@ +	.global __cp_begin +	.hidden __cp_begin +	.global __cp_end +	.hidden __cp_end +	.global __cp_cancel +	.hidden __cp_cancel +	.hidden __cancel +	.global __syscall_cp_asm +	.hidden __syscall_cp_asm +	.text +	.type   __syscall_cp_asm,%function +__syscall_cp_asm: +	# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th +__cp_begin: +	# if (self->cancel) goto __cp_cancel +	lwz   0, 0(3) +	cmpwi cr7, 0, 0 +	bne-  cr7, __cp_cancel + +	# make syscall +	mr    0,  4 +	mr    3,  5 +	mr    4,  6 +	mr    5,  7 +	mr    6,  8 +	mr    7,  9 +	mr    8, 10 +	sc + +__cp_end: +	# return error ? -r3 : r3 +	bnslr+ +	neg 3, 3 +	blr + +__cp_cancel: +	b __cancel | 
