1 /*- 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * William Jolitz. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * from: @(#)SYS.h 5.5 (Berkeley) 5/7/91 33 * $NetBSD: SYS.h,v 1.6 2003/08/07 16:42:18 agc Exp $ 34 */ 35 36 #include <machine/asm.h> 37 #include <sys/syscall.h> 38 39 #ifdef __STDC__ 40 #define SYSTRAP(x) \ 41 mov.l 903f, r0; \ 42 .long 0xc380; /* trapa #0x80 */ \ 43 nop; \ 44 bra 904f; \ 45 nop; \ 46 .align 2; \ 47 903: .long (SYS_ ## x); \ 48 904: 49 #else 50 #define SYSTRAP(x) \ 51 mov.l 903f, r0; \ 52 trapa #0x80; \ 53 nop; \ 54 bra 904f; \ 55 nop; \ 56 .align 2; \ 57 903: .long (SYS_/**/x); \ 58 904: 59 #endif 60 61 #define _SYSCALL_NOERROR(x,y) \ 62 ENTRY(x); \ 63 SYSTRAP(y) 64 65 #ifdef PIC 66 #define _SYSCALL(x,y) \ 67 .text; \ 68 911: mov.l 912f, r3; \ 69 braf r3; \ 70 nop; \ 71 .align 2; \ 72 912: .long cerror-(911b+6); \ 73 _SYSCALL_NOERROR(x,y); \ 74 bf 911b; \ 75 nop 76 #else 77 #define _SYSCALL(x,y) \ 78 .text; \ 79 911: mov.l 912f, r3; \ 80 jmp @r3; \ 81 nop; \ 82 .align 2; \ 83 912: .long cerror; \ 84 _SYSCALL_NOERROR(x,y); \ 85 bf 911b; \ 86 nop 87 #endif 88 89 #define SYSCALL_NOERROR(x) \ 90 _SYSCALL_NOERROR(x,x) 91 92 #define SYSCALL(x) \ 93 _SYSCALL(x,x) 94 95 #define PSEUDO_NOERROR(x,y) \ 96 _SYSCALL_NOERROR(x,y); \ 97 rts; \ 98 nop 99 100 #define PSEUDO(x,y) \ 101 _SYSCALL(x,y); \ 102 rts; \ 103 nop 104 105 #define RSYSCALL_NOERROR(x) \ 106 PSEUDO_NOERROR(x,x) 107 108 #define RSYSCALL(x) \ 109 PSEUDO(x,x) 110 111 #ifdef WEAK_ALIAS 112 #define WSYSCALL(weak,strong) \ 113 WEAK_ALIAS(weak,strong); \ 114 PSEUDO(strong,weak) 115 #else 116 #define WSYSCALL(weak,strong) \ 117 PSEUDO(weak,weak) 118 #endif 119 120 .globl cerror 121