xref: /openbsd-src/lib/libc/arch/sh/sys/tfork_thread.S (revision 3374c67d44f9b75b98444cbf63020f777792342e)
1/*	$OpenBSD: tfork_thread.S,v 1.4 2022/09/02 06:19:04 miod Exp $	*/
2
3/*
4 * Copyright (c) 2007 Miodrag Vallat.
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice, this permission notice, and the disclaimer below
9 * appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include "SYS.h"
21
22/*
23 * int __tfork_thread(const struct __tfork *param, size_t psize, void (*func)(void *), void *arg);
24 *			r4			r5		   r6		r7
25 */
26ENTRY(__tfork_thread)
27#if SYS___tfork >= 128
28	mov.l	.LSYS___tfork, r0
29#else
30	mov	#SYS___tfork, r0
31#endif
32	trapa	#0x80
33	bf	9f
34
35	tst	r0, r0
36	bt	1f
37
38	/*
39	 * In parent process: just return.
40	 */
41	rts
42	 nop
43
441:
45	/*
46	 * In child process: invoke function, then exit.
47	 */
48	jsr	@r6
49	 mov	r7, r4
50
51#if SYS___threxit >= 128
52	mov.l	.LSYS___threxit, r0
53#else
54	mov	#SYS___threxit, r0
55#endif
56	trapa	#0x80
57
589:
59	/*
60	 * System call failure.
61	 */
62	SET_ERRNO_AND_RETURN
63
64	.align 2
65#if SYS___tfork >= 128
66.LSYS___tfork:	.long SYS___tfork
67#endif
68#if SYS___threxit >= 128
69.LSYS___threxit:	.long SYS___threxit
70#endif
71
72	SET_ENTRY_SIZE(__tfork_thread)
73