SYS.h revision 1.16
11.16Sskrll/*	$NetBSD: SYS.h,v 1.16 2023/07/23 07:25:04 skrll 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.16SskrllENTRY(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.16SskrllEND(x)
1061.1Sbjh21
1071.1Sbjh21#define PSEUDO(x,y)							\
1081.1Sbjh21	_SYSCALL(x,y);							\
1091.13Smatt	RET;								\
1101.16SskrllEND(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