xref: /openbsd-src/lib/libc/arch/sh/sys/tfork_thread.S (revision c6f64c6fd2f950c7ce17d31c283f1cb710580942)
1/*	$OpenBSD: tfork_thread.S,v 1.1 2012/03/22 00:44:56 guenther 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, void *stack, void (*func)(void *), void *arg);
24 *			r4			r5		   r6		r7
25 */
26ENTRY(__tfork_thread)
27	mov.l	.LSYS___tfork, r0
28	.word	0xc380		/* trapa #0x80 */
29	bf	9f
30
31	tst	r0, r0
32	bt	1f
33
34	/*
35	 * In parent process: just return.
36	 */
37	rts
38	 nop
39
401:
41	/*
42	 * In child process: switch stack, invoke function, then exit.
43	 */
44	mov	r5, sp
45	jsr	@r6
46	 mov	r7, r4
47
48	mov.l	.LSYS___threxit, r0
49	.word	0xc380		/* trapa #0x80 */
50
519:
52	/*
53	 * System call failure.
54	 */
55	JUMP_CERROR
56
57	.align 2
58.LSYS___tfork:	.long SYS___tfork
59.LSYS___threxit:	.long SYS___threxit
60
61	SET_ENTRY_SIZE(__tfork_thread)
62