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