1*83762a71Sderaadt /* $OpenBSD: SYS.h,v 1.18 2023/12/10 16:45:52 deraadt Exp $ */ 2ddf59533Sart /*- 3ddf59533Sart * Copyright (c) 1992, 1993 4ddf59533Sart * The Regents of the University of California. All rights reserved. 5ddf59533Sart * 6ddf59533Sart * This software was developed by the Computer Systems Engineering group 7ddf59533Sart * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 8ddf59533Sart * contributed to Berkeley. 9ddf59533Sart * 10ddf59533Sart * Redistribution and use in source and binary forms, with or without 11ddf59533Sart * modification, are permitted provided that the following conditions 12ddf59533Sart * are met: 13ddf59533Sart * 1. Redistributions of source code must retain the above copyright 14ddf59533Sart * notice, this list of conditions and the following disclaimer. 15ddf59533Sart * 2. Redistributions in binary form must reproduce the above copyright 16ddf59533Sart * notice, this list of conditions and the following disclaimer in the 17ddf59533Sart * documentation and/or other materials provided with the distribution. 186580fee3Smillert * 3. Neither the name of the University nor the names of its contributors 19ddf59533Sart * may be used to endorse or promote products derived from this software 20ddf59533Sart * without specific prior written permission. 21ddf59533Sart * 22ddf59533Sart * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23ddf59533Sart * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24ddf59533Sart * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25ddf59533Sart * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26ddf59533Sart * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27ddf59533Sart * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28ddf59533Sart * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29ddf59533Sart * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30ddf59533Sart * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31ddf59533Sart * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32ddf59533Sart * SUCH DAMAGE. 33ddf59533Sart * 34ddf59533Sart * @(#)SYS.h 8.1 (Berkeley) 6/4/93 35ddf59533Sart * 36ddf59533Sart * from: Header: SYS.h,v 1.2 92/07/03 18:57:00 torek Exp 37ddf59533Sart * $NetBSD: SYS.h,v 1.6 2001/07/23 07:26:50 thorpej Exp $ 38ddf59533Sart */ 39ddf59533Sart 40ec0f1ad6Sguenther #include "DEFS.h" 41ddf59533Sart #include <sys/syscall.h> 42ddf59533Sart #include <machine/trap.h> 43ddf59533Sart 44fe38b55cSguenther /* offsetof(struct tib, tib_errno) - offsetof(struct tib, __tib_tcb) */ 45fe38b55cSguenther #define TCB_OFFSET_ERRNO 24 46fe38b55cSguenther 47ddf59533Sart #define _CAT(x,y) x##y 48ddf59533Sart 4994582118Sart #define __ENTRY(p,x) ENTRY(_CAT(p,x)) ; .weak x; x = _CAT(p,x) 50514a545fSguenther #define __ENTRY_HIDDEN(p,x) ENTRY(_CAT(p,x)) 5194582118Sart 52aa797096Sguenther #define __END_HIDDEN(p,x) END(_CAT(p,x)); \ 53aa797096Sguenther _HIDDEN_FALIAS(x, _CAT(p,x)); \ 54aa797096Sguenther END(_HIDDEN(x)) 55aa797096Sguenther #define __END(p,x) __END_HIDDEN(p,x); END(x) 56aa797096Sguenther 57ddf59533Sart /* 58fe38b55cSguenther * ERROR sets the thread's errno and returns 59ddf59533Sart */ 60fe38b55cSguenther #define ERROR() \ 61fe38b55cSguenther st %o0, [%g7 + TCB_OFFSET_ERRNO]; \ 62fe38b55cSguenther retl; \ 63fe38b55cSguenther mov -1, %o0 64ddf59533Sart 65ddf59533Sart /* 66ddf59533Sart * SYSCALL is used when further action must be taken before returning. 67ddf59533Sart * Note that it adds a `nop' over what we could do, if we only knew what 68ddf59533Sart * came at label 1.... 69ddf59533Sart */ 703138a1bfSdrahn #define _SYSCALL(p,x,y) \ 71*83762a71Sderaadt __ENTRY(p,x); \ 72*83762a71Sderaadt mov _CAT(SYS_,y),%g1; \ 73*83762a71Sderaadt 97: t ST_SYSCALL; \ 74*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,y), 97b); \ 75*83762a71Sderaadt bcc 1f; \ 76*83762a71Sderaadt nop; \ 77*83762a71Sderaadt ERROR(); \ 78*83762a71Sderaadt 1: 79*83762a71Sderaadt 80514a545fSguenther #define _SYSCALL_HIDDEN(p,x,y) \ 81*83762a71Sderaadt __ENTRY_HIDDEN(p,x); \ 82*83762a71Sderaadt mov _CAT(SYS_,y),%g1; \ 83*83762a71Sderaadt 97: t ST_SYSCALL; \ 84*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,y), 97b); \ 85*83762a71Sderaadt bcc 1f; \ 86*83762a71Sderaadt nop; \ 87*83762a71Sderaadt ERROR(); \ 88*83762a71Sderaadt 1: 89ddf59533Sart 903138a1bfSdrahn #define __SYSCALL(p,x) \ 913138a1bfSdrahn _SYSCALL(p,x,x) 92ddf59533Sart 93514a545fSguenther #define __SYSCALL_HIDDEN(p,x) \ 94514a545fSguenther _SYSCALL_HIDDEN(p,x,x) 95514a545fSguenther 96ddf59533Sart /* 97ddf59533Sart * RSYSCALL is used when the system call should just return. Here 98ddf59533Sart * we use the SYSCALL_G2RFLAG to put the `success' return address in %g2 99ddf59533Sart * and avoid a branch. 100ddf59533Sart */ 1013138a1bfSdrahn #define __RSYSCALL(p,x) \ 102*83762a71Sderaadt __ENTRY(p,x); \ 103*83762a71Sderaadt mov (_CAT(SYS_,x))|SYSCALL_G2RFLAG,%g1; \ 104*83762a71Sderaadt add %o7,8,%g2; \ 105*83762a71Sderaadt 97: t ST_SYSCALL; \ 106*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,x), 97b); \ 107*83762a71Sderaadt ERROR(); \ 108*83762a71Sderaadt __END(p,x) 109514a545fSguenther #define __RSYSCALL_HIDDEN(p,x) \ 110*83762a71Sderaadt __ENTRY_HIDDEN(p,x); \ 111*83762a71Sderaadt mov (_CAT(SYS_,x))|SYSCALL_G2RFLAG,%g1; \ 112*83762a71Sderaadt add %o7,8,%g2; \ 113*83762a71Sderaadt 97: t ST_SYSCALL; \ 114*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,x), 97b); \ 115*83762a71Sderaadt ERROR(); \ 116*83762a71Sderaadt __END_HIDDEN(p,x) 117ddf59533Sart 118ddf59533Sart /* 119ddf59533Sart * PSEUDO(x,y) is like RSYSCALL(y) except that the name is x. 120ddf59533Sart */ 1213138a1bfSdrahn #define __PSEUDO(p,x,y) \ 122*83762a71Sderaadt __ENTRY(p,x); \ 123*83762a71Sderaadt mov (_CAT(SYS_,y))|SYSCALL_G2RFLAG,%g1; \ 124*83762a71Sderaadt add %o7,8,%g2; \ 125*83762a71Sderaadt 97: t ST_SYSCALL; \ 126*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,y), 97b); \ 127*83762a71Sderaadt ERROR(); \ 128*83762a71Sderaadt __END(p,x) 129ddf59533Sart 130ddf59533Sart /* 131ddf59533Sart * SYSCALL_NOERROR is like SYSCALL, except it's used for syscalls 132ddf59533Sart * that never fail. 133ddf59533Sart * 134ddf59533Sart * XXX - This should be optimized. 135ddf59533Sart */ 1363138a1bfSdrahn #define __SYSCALL_NOERROR(p,x) \ 137*83762a71Sderaadt __ENTRY(p,x); \ 138*83762a71Sderaadt mov _CAT(SYS_,x),%g1; \ 139*83762a71Sderaadt 97: t ST_SYSCALL; \ 140*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,x), 97b) 141ddf59533Sart 142ddf59533Sart /* 143ddf59533Sart * RSYSCALL_NOERROR is like RSYSCALL, except it's used for syscalls 144ddf59533Sart * that never fail. 145ddf59533Sart * 146ddf59533Sart * XXX - This should be optimized. 147ddf59533Sart */ 1483138a1bfSdrahn #define __RSYSCALL_NOERROR(p,x) \ 149*83762a71Sderaadt __ENTRY(p,x); \ 150*83762a71Sderaadt mov (_CAT(SYS_,x))|SYSCALL_G2RFLAG,%g1; \ 151*83762a71Sderaadt add %o7,8,%g2; \ 152*83762a71Sderaadt 97: t ST_SYSCALL; \ 153*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,x), 97b); \ 154*83762a71Sderaadt __END(p,x) 155ddf59533Sart 156ddf59533Sart /* 157ddf59533Sart * PSEUDO_NOERROR(x,y) is like RSYSCALL_NOERROR(y) except that the name is x. 158ddf59533Sart */ 1593138a1bfSdrahn #define __PSEUDO_NOERROR(p,x,y) \ 160*83762a71Sderaadt __ENTRY(p,x); \ 161*83762a71Sderaadt mov (_CAT(SYS_,y))|SYSCALL_G2RFLAG,%g1; \ 162*83762a71Sderaadt add %o7,8,%g2; \ 163*83762a71Sderaadt 97: t ST_SYSCALL; \ 164*83762a71Sderaadt PINSYSCALL(_CAT(SYS_,y), 97b); \ 165*83762a71Sderaadt __END(p,x) 166ddf59533Sart 167a5992a6bSart /* 168a5992a6bSart * SYSENTRY is for functions that pretend to be syscalls. 169a5992a6bSart */ 1703138a1bfSdrahn #define SYSCALL(x) __SYSCALL(_thread_sys_,x) 1713138a1bfSdrahn #define RSYSCALL(x) __RSYSCALL(_thread_sys_,x) 172514a545fSguenther #define RSYSCALL_HIDDEN(x) __RSYSCALL_HIDDEN(_thread_sys_,x) 1733138a1bfSdrahn #define RSYSCALL_NOERROR(x,y) __RSYSCALL_NOERROR(_thread_sys_,x,y) 1743138a1bfSdrahn #define PSEUDO(x,y) __PSEUDO(_thread_sys_,x,y) 1753138a1bfSdrahn #define PSEUDO_NOERROR(x,y) __PSEUDO_NOERROR(_thread_sys_,x,y) 1765aed4d28Sguenther #define SYSENTRY(x) __ENTRY(_thread_sys_,x) 1775aed4d28Sguenther #define SYSENTRY_HIDDEN(x) __ENTRY_HIDDEN(_thread_sys_,x) 178aa797096Sguenther #define SYSCALL_END(x) __END(_thread_sys_,x) 1795aed4d28Sguenther #define SYSCALL_END_HIDDEN(x) __END_HIDDEN(_thread_sys_,x) 180