diff options
Diffstat (limited to 'src/thread')
| -rw-r--r-- | src/thread/s390x/clone.s | 6 | ||||
| -rw-r--r-- | src/thread/s390x/syscall_cp.s | 2 | 
2 files changed, 8 insertions, 0 deletions
diff --git a/src/thread/s390x/clone.s b/src/thread/s390x/clone.s index 577748ea..2125f20b 100644 --- a/src/thread/s390x/clone.s +++ b/src/thread/s390x/clone.s @@ -17,6 +17,9 @@ __clone:  	# if (!tid) syscall(SYS_exit, a(d));  	# return tid; +	# preserve call-saved register used as syscall arg +	stg  %r6, 48(%r15) +  	# create initial stack frame for new thread  	nill %r3, 0xfff8  	aghi %r3, -160 @@ -35,6 +38,9 @@ __clone:  	lg   %r6, 160(%r15)  	svc  120 +	# restore call-saved register +	lg   %r6, 48(%r15) +  	# if error or if we're the parent, return  	ltgr %r2, %r2  	bnzr %r14 diff --git a/src/thread/s390x/syscall_cp.s b/src/thread/s390x/syscall_cp.s index c1da40de..d094cbf5 100644 --- a/src/thread/s390x/syscall_cp.s +++ b/src/thread/s390x/syscall_cp.s @@ -14,6 +14,7 @@ __cp_begin:  	icm %r2, 15, 0(%r2)  	jne __cp_cancel +	stg %r6, 48(%r15)  	stg %r7, 56(%r15)  	lgr %r1, %r3  	lgr %r2, %r4 @@ -26,6 +27,7 @@ __cp_begin:  __cp_end:  	lg  %r7, 56(%r15) +	lg  %r6, 48(%r15)  	br  %r14  __cp_cancel:  | 
