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