SYS.h revision 1.15
11.15Smatt/* $NetBSD: SYS.h,v 1.15 2013/08/19 22:13:34 matt Exp $ */ 21.1Sbjh21 31.1Sbjh21/*- 41.1Sbjh21 * Copyright (c) 1990 The Regents of the University of California. 51.1Sbjh21 * All rights reserved. 61.1Sbjh21 * 71.1Sbjh21 * This code is derived from software contributed to Berkeley by 81.1Sbjh21 * William Jolitz. 91.1Sbjh21 * 101.1Sbjh21 * Redistribution and use in source and binary forms, with or without 111.1Sbjh21 * modification, are permitted provided that the following conditions 121.1Sbjh21 * are met: 131.1Sbjh21 * 1. Redistributions of source code must retain the above copyright 141.1Sbjh21 * notice, this list of conditions and the following disclaimer. 151.1Sbjh21 * 2. Redistributions in binary form must reproduce the above copyright 161.1Sbjh21 * notice, this list of conditions and the following disclaimer in the 171.1Sbjh21 * documentation and/or other materials provided with the distribution. 181.8Sagc * 3. Neither the name of the University nor the names of its contributors 191.1Sbjh21 * may be used to endorse or promote products derived from this software 201.1Sbjh21 * without specific prior written permission. 211.1Sbjh21 * 221.1Sbjh21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 231.1Sbjh21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 241.1Sbjh21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 251.1Sbjh21 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 261.1Sbjh21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 271.1Sbjh21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 281.1Sbjh21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 291.1Sbjh21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 301.1Sbjh21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 311.1Sbjh21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 321.1Sbjh21 * SUCH DAMAGE. 331.1Sbjh21 * 341.1Sbjh21 * from: @(#)SYS.h 5.5 (Berkeley) 5/7/91 351.1Sbjh21 */ 361.1Sbjh21 371.15Smatt#define _TEXT_SECTION .section .text.hot, "ax" 381.15Smatt 391.1Sbjh21#include <machine/asm.h> 401.1Sbjh21#include <sys/syscall.h> 411.4Sbjh21#include <arm/swi.h> 421.1Sbjh21 431.13Smatt#ifndef __STDC__ 441.13Smatt#error __STDC__ not defined 451.13Smatt#endif 461.13Smatt 471.13Smatt#if !defined(__thumb__) 481.13Smatt#define SYSTRAP(x) svc #SWI_OS_NETBSD | SYS_ ## x 491.13Smatt#else 501.13Smatt.macro emitsvc x 511.13Smatt mov ip, r0 521.13Smatt.ifeq \x / 256 531.13Smatt movs r0, #\x 541.13Smatt.else 551.13Smatt#if defined(_ARM_ARCH_7) 561.13Smatt movw r0, #\x 571.6Swiz#else 581.13Smatt.ifeq (\x & 3) 591.13Smatt movs r0, #(\x / 4) 601.13Smatt lsls r0, r0, #3 611.13Smatt.else 621.13Smatt.ifeq (\x & 1) 631.13Smatt movs r0, #(\x / 2) 641.13Smatt lsls r0, r0, #1 651.13Smatt.else 661.13Smatt movs r0, #(\x / 256) 671.13Smatt lsls r0, r0, #8 681.13Smatt adds r0, r0, #(\x & 255) 691.13Smatt.endif 701.13Smatt.endif 711.13Smatt#endif /* !_ARM_ARCH_7 */ 721.13Smatt.endif 731.13Smatt svc #255 741.13Smatt.endm 751.13Smatt#define SYSTRAP(x) emitsvc SYS_ ## x 761.13Smatt#endif /* __thumb__ */ 771.1Sbjh21 781.2Smatt#define CERROR _C_LABEL(__cerror) 791.2Smatt#define CURBRK _C_LABEL(__curbrk) 801.2Smatt 811.1Sbjh21#define _SYSCALL_NOERROR(x,y) \ 821.1Sbjh21 ENTRY(x); \ 831.1Sbjh21 SYSTRAP(y) 841.1Sbjh21 851.13Smatt#if !defined(__thumb__) || defined(_ARM_ARCH_T2) 861.13Smatt#define _INVOKE_CERROR() bcs CERROR 871.13Smatt#else 881.13Smatt#define _INVOKE_CERROR() \ 891.14Smatt bcc 86f; push {r3,lr}; bl CERROR; pop {r3,pc}; 86: 901.13Smatt#endif 911.1Sbjh21#define _SYSCALL(x, y) \ 921.1Sbjh21 _SYSCALL_NOERROR(x,y); \ 931.13Smatt _INVOKE_CERROR() 941.1Sbjh21 951.1Sbjh21#define SYSCALL_NOERROR(x) \ 961.1Sbjh21 _SYSCALL_NOERROR(x,x) 971.1Sbjh21 981.1Sbjh21#define SYSCALL(x) \ 991.1Sbjh21 _SYSCALL(x,x) 1001.1Sbjh21 1011.1Sbjh21 1021.1Sbjh21#define PSEUDO_NOERROR(x,y) \ 1031.1Sbjh21 _SYSCALL_NOERROR(x,y); \ 1041.13Smatt RET; \ 1051.13Smatt END(x) 1061.1Sbjh21 1071.1Sbjh21#define PSEUDO(x,y) \ 1081.1Sbjh21 _SYSCALL(x,y); \ 1091.13Smatt RET; \ 1101.13Smatt END(x) 1111.1Sbjh21 1121.1Sbjh21 1131.1Sbjh21#define RSYSCALL_NOERROR(x) \ 1141.1Sbjh21 PSEUDO_NOERROR(x,x) 1151.1Sbjh21 1161.1Sbjh21#define RSYSCALL(x) \ 1171.1Sbjh21 PSEUDO(x,x) 1181.3Sthorpej 1191.3Sthorpej#ifdef WEAK_ALIAS 1201.3Sthorpej#define WSYSCALL(weak,strong) \ 1211.3Sthorpej WEAK_ALIAS(weak,strong); \ 1221.3Sthorpej PSEUDO(strong,weak) 1231.3Sthorpej#else 1241.3Sthorpej#define WSYSCALL(weak,strong) \ 1251.3Sthorpej PSEUDO(weak,weak) 1261.3Sthorpej#endif 1271.1Sbjh21 1281.12Smatt .hidden CERROR 1291.2Smatt .globl CERROR 130