xref: /titanic_50/usr/src/lib/libbc/sparc/inc/SYS.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate !
23*7c478bd9Sstevel@tonic-gate !	"@(#)SYS.h 1.14 88/02/08"
24*7c478bd9Sstevel@tonic-gate !       Copyright (c) 1986, 1996 by Sun Microsystems, Inc.
25*7c478bd9Sstevel@tonic-gate !	All rights reserved.
26*7c478bd9Sstevel@tonic-gate !
27*7c478bd9Sstevel@tonic-gate 
28*7c478bd9Sstevel@tonic-gate #include <sys/syscall.h>
29*7c478bd9Sstevel@tonic-gate #include <machine/asm_linkage.h>
30*7c478bd9Sstevel@tonic-gate #include "PIC.h"
31*7c478bd9Sstevel@tonic-gate 
32*7c478bd9Sstevel@tonic-gate #define SV_ERESTART	91	/* ERESTART is returned by the kernel for
33*7c478bd9Sstevel@tonic-gate 				   restartable system calls */
34*7c478bd9Sstevel@tonic-gate 
35*7c478bd9Sstevel@tonic-gate #define WINDOWSIZE	(16*4)
36*7c478bd9Sstevel@tonic-gate 
37*7c478bd9Sstevel@tonic-gate 	.global	.cerror
38*7c478bd9Sstevel@tonic-gate 
39*7c478bd9Sstevel@tonic-gate #define SYSCALL(x) \
40*7c478bd9Sstevel@tonic-gate 	ENTRY(x); \
41*7c478bd9Sstevel@tonic-gate 	mov	SYS_/**/x, %g1; \
42*7c478bd9Sstevel@tonic-gate 	t	8; \
43*7c478bd9Sstevel@tonic-gate 	CERROR(o5)
44*7c478bd9Sstevel@tonic-gate 
45*7c478bd9Sstevel@tonic-gate #define BSDSYSCALL(x) \
46*7c478bd9Sstevel@tonic-gate 	ENTRY(_/**/x); \
47*7c478bd9Sstevel@tonic-gate 	mov	SYS_/**/x, %g1; \
48*7c478bd9Sstevel@tonic-gate 	t	8; \
49*7c478bd9Sstevel@tonic-gate 	CERROR(o5)
50*7c478bd9Sstevel@tonic-gate 
51*7c478bd9Sstevel@tonic-gate /*
52*7c478bd9Sstevel@tonic-gate  * SYSREENTRY provides the entry sequence for restartable system calls.
53*7c478bd9Sstevel@tonic-gate  */
54*7c478bd9Sstevel@tonic-gate #define SYSREENTRY(x)	\
55*7c478bd9Sstevel@tonic-gate 	ENTRY(x);	\
56*7c478bd9Sstevel@tonic-gate 	st      %o0,[%sp+68]; \
57*7c478bd9Sstevel@tonic-gate .restart_/**/x:
58*7c478bd9Sstevel@tonic-gate 
59*7c478bd9Sstevel@tonic-gate #define PSEUDO(x, y) \
60*7c478bd9Sstevel@tonic-gate 	ENTRY(x); \
61*7c478bd9Sstevel@tonic-gate 	mov	SYS_/**/y, %g1; \
62*7c478bd9Sstevel@tonic-gate 	t	8;
63*7c478bd9Sstevel@tonic-gate 
64*7c478bd9Sstevel@tonic-gate /*
65*7c478bd9Sstevel@tonic-gate  * SYSCALL_RESTART provides the most common restartable system call sequence.
66*7c478bd9Sstevel@tonic-gate  */
67*7c478bd9Sstevel@tonic-gate #define SYSCALL_RESTART(x) \
68*7c478bd9Sstevel@tonic-gate 	SYSREENTRY(x); \
69*7c478bd9Sstevel@tonic-gate 	mov	SYS_/**/x, %g1; \
70*7c478bd9Sstevel@tonic-gate 	t	8; \
71*7c478bd9Sstevel@tonic-gate 	SYSRESTART(.restart_/**/x)
72*7c478bd9Sstevel@tonic-gate 
73*7c478bd9Sstevel@tonic-gate /*
74*7c478bd9Sstevel@tonic-gate  * SYSREENTRY provides the entry sequence for restartable system calls.
75*7c478bd9Sstevel@tonic-gate  */
76*7c478bd9Sstevel@tonic-gate #define SYSREENTRY(x) \
77*7c478bd9Sstevel@tonic-gate 	ENTRY(x); \
78*7c478bd9Sstevel@tonic-gate 	st      %o0,[%sp+68]; \
79*7c478bd9Sstevel@tonic-gate .restart_/**/x:
80*7c478bd9Sstevel@tonic-gate 
81*7c478bd9Sstevel@tonic-gate /*
82*7c478bd9Sstevel@tonic-gate  * SYSRESTART provides the error handling sequence for restartable
83*7c478bd9Sstevel@tonic-gate  * system calls.
84*7c478bd9Sstevel@tonic-gate  */
85*7c478bd9Sstevel@tonic-gate #ifdef PIC
86*7c478bd9Sstevel@tonic-gate #define SYSRESTART(x) \
87*7c478bd9Sstevel@tonic-gate 	bcc	noerr; \
88*7c478bd9Sstevel@tonic-gate 	cmp	%o0, SV_ERESTART; \
89*7c478bd9Sstevel@tonic-gate 	be,a	x; \
90*7c478bd9Sstevel@tonic-gate 	ld	 [%sp+68], %o0; \
91*7c478bd9Sstevel@tonic-gate 	PIC_SETUP(o5); \
92*7c478bd9Sstevel@tonic-gate 	ld	[%o5 + .cerror], %o5; \
93*7c478bd9Sstevel@tonic-gate 	jmp	%o5; \
94*7c478bd9Sstevel@tonic-gate 	.empty; \
95*7c478bd9Sstevel@tonic-gate noerr:	nop	;
96*7c478bd9Sstevel@tonic-gate #else
97*7c478bd9Sstevel@tonic-gate #define SYSRESTART(x) \
98*7c478bd9Sstevel@tonic-gate 	bcc	noerr; \
99*7c478bd9Sstevel@tonic-gate 	cmp	%o0, SV_ERESTART; \
100*7c478bd9Sstevel@tonic-gate 	be,a	x; \
101*7c478bd9Sstevel@tonic-gate 	ld	[%sp+68], %o0; \
102*7c478bd9Sstevel@tonic-gate 	ba	.cerror; \
103*7c478bd9Sstevel@tonic-gate 	.empty; \
104*7c478bd9Sstevel@tonic-gate noerr:	nop	;
105*7c478bd9Sstevel@tonic-gate #endif
106*7c478bd9Sstevel@tonic-gate 
107*7c478bd9Sstevel@tonic-gate #define RET	retl; nop;
108*7c478bd9Sstevel@tonic-gate 
109*7c478bd9Sstevel@tonic-gate #ifdef PIC
110*7c478bd9Sstevel@tonic-gate #define CERROR(free_reg) \
111*7c478bd9Sstevel@tonic-gate 	bcc	noerr; \
112*7c478bd9Sstevel@tonic-gate 	PIC_SETUP(free_reg); \
113*7c478bd9Sstevel@tonic-gate 	.empty;	\
114*7c478bd9Sstevel@tonic-gate 	ld	[%free_reg+ .cerror],%free_reg; \
115*7c478bd9Sstevel@tonic-gate 	jmp	%free_reg; \
116*7c478bd9Sstevel@tonic-gate 	.empty;	\
117*7c478bd9Sstevel@tonic-gate noerr:	nop;
118*7c478bd9Sstevel@tonic-gate #else
119*7c478bd9Sstevel@tonic-gate #define CERROR(free_reg) \
120*7c478bd9Sstevel@tonic-gate 	bcc 	noerr; \
121*7c478bd9Sstevel@tonic-gate 	.empty; \
122*7c478bd9Sstevel@tonic-gate 	sethi	%hi(.cerror), %free_reg;\
123*7c478bd9Sstevel@tonic-gate 	or	%free_reg, %lo(.cerror), %free_reg;\
124*7c478bd9Sstevel@tonic-gate 	jmp	%free_reg;\
125*7c478bd9Sstevel@tonic-gate 	.empty;\
126*7c478bd9Sstevel@tonic-gate noerr: nop;
127*7c478bd9Sstevel@tonic-gate #endif
128