xref: /openbsd-src/lib/libc/arch/powerpc64/sys/tfork_thread.S (revision 83762a71f74848f4d09174ce350838b4204957c5)
1*83762a71Sderaadt/* $OpenBSD: tfork_thread.S,v 1.5 2023/12/10 16:45:52 deraadt Exp $ */
29674f442Sdrahn
39674f442Sdrahn/*
49674f442Sdrahn * Copyright (c) 2005 Tim Wiess <tim@nop.cx>
59674f442Sdrahn *
69674f442Sdrahn * Permission to use, copy, modify, and distribute this software for any
79674f442Sdrahn * purpose with or without fee is hereby granted, provided that the above
89674f442Sdrahn * copyright notice and this permission notice appear in all copies.
99674f442Sdrahn *
109674f442Sdrahn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
119674f442Sdrahn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
129674f442Sdrahn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
139674f442Sdrahn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
149674f442Sdrahn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
159674f442Sdrahn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
169674f442Sdrahn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
179674f442Sdrahn */
189674f442Sdrahn
199674f442Sdrahn#include "SYS.h"
209674f442Sdrahn
219674f442SdrahnENTRY(__tfork_thread)
2242d518b6Sderaadt	RETGUARD_SETUP(__tfork_thread, %r11)
2342d518b6Sderaadt
249674f442Sdrahn	li	%r0, SYS___tfork
25*83762a71Sderaadt99:	sc
26*83762a71Sderaadt	PINSYSCALL(SYS___tfork, 99b)
27f0038c0cSkettenis	cmpwi	%r0, 0
289674f442Sdrahn	bne	1f
299674f442Sdrahn
309674f442Sdrahn	/* check if we are parent or child */
319674f442Sdrahn	cmpwi	%r3, 0
329674f442Sdrahn	bnelr
339674f442Sdrahn
349674f442Sdrahn	/* child */
35f0038c0cSkettenis	mr	%r12, %r5
369674f442Sdrahn	mtlr	%r5		/* fp */
379674f442Sdrahn	mr	%r3, %r6	/* arg */
389674f442Sdrahn	subi	%r1, %r1, 32	/* fixup sp to get headroom */
399674f442Sdrahn	blrl
409674f442Sdrahn
419674f442Sdrahn	/* child returned, call __threxit */
429674f442Sdrahn	li	%r0, SYS___threxit
43*83762a71Sderaadt98:	sc
44*83762a71Sderaadt	PINSYSCALL(SYS___threxit, 98b)
4513df6982Sderaadt	.long	0		/* illegal */
469674f442Sdrahn1:
479674f442Sdrahn	stw	%r0, R13_OFFSET_ERRNO(%r13)
489674f442Sdrahn	li	%r3, -1
4942d518b6Sderaadt	RETGUARD_CHECK(__tfork_thread, %r11)
509674f442Sdrahn	blr
519674f442SdrahnEND(__tfork_thread)
52