xref: /openbsd/lib/libc/arch/sh/sys/tfork_thread.S (revision 510d2225)
1/*	$OpenBSD: tfork_thread.S,v 1.5 2023/12/10 16:45:52 deraadt 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
3299:	trapa	#0x80
33	PINSYSCALL(SYS___tfork, 99b)
34	bf	9f
35
36	tst	r0, r0
37	bt	1f
38
39	/*
40	 * In parent process: just return.
41	 */
42	rts
43	 nop
44
451:
46	/*
47	 * In child process: invoke function, then exit.
48	 */
49	jsr	@r6
50	 mov	r7, r4
51
52#if SYS___threxit >= 128
53	mov.l	.LSYS___threxit, r0
54#else
55	mov	#SYS___threxit, r0
56#endif
5798:	trapa	#0x80
58	PINSYSCALL(SYS___threxit, 98b)
59
609:
61	/*
62	 * System call failure.
63	 */
64	SET_ERRNO_AND_RETURN
65
66	.align 2
67#if SYS___tfork >= 128
68.LSYS___tfork:	.long SYS___tfork
69#endif
70#if SYS___threxit >= 128
71.LSYS___threxit:	.long SYS___threxit
72#endif
73
74	SET_ENTRY_SIZE(__tfork_thread)
75