94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _SYSCALLASM_H_
 | 
						|
#define _SYSCALLASM_H_
 | 
						|
 | 
						|
/*
 | 
						|
 * This file defines the system calls for SPARC for the assembler.
 | 
						|
 * Anything C-ish is not allowed in this file.
 | 
						|
 * C files should include syscall.h.
 | 
						|
 */
 | 
						|
 | 
						|
#include "syscall.h"
 | 
						|
 | 
						|
/* Some macros for writing assember syscall stubs.  */
 | 
						|
 | 
						|
#ifdef SVR4
 | 
						|
#define TEXT_SECTION	.section ".text"
 | 
						|
#define DATA_SECTION	.section ".data"
 | 
						|
#define ALIGN(x)	.align x
 | 
						|
#define GLOBAL(sym)	.global sym
 | 
						|
#define WORD(x)		.long x
 | 
						|
#define ASM_SYMBOL(name) name
 | 
						|
#define ASM_PRIVATE_SYMBOL(name) _##name
 | 
						|
#define SYSCALL_TRAP	8
 | 
						|
#else
 | 
						|
#define TEXT_SECTION	.text
 | 
						|
#define DATA_SECTION	.data
 | 
						|
#define ALIGN(x)	.align x
 | 
						|
#define GLOBAL(sym)	.global sym
 | 
						|
#define WORD(x)		.word x
 | 
						|
#define ASM_SYMBOL(name) _##name
 | 
						|
#define ASM_PRIVATE_SYMBOL(name) name
 | 
						|
#define SYSCALL_TRAP	0
 | 
						|
#endif
 | 
						|
 | 
						|
#define defsyscall(name, n) \
 | 
						|
	TEXT_SECTION ;			\
 | 
						|
	ALIGN (4) ;			\
 | 
						|
	GLOBAL (ASM_SYMBOL (name)) ;	\
 | 
						|
ASM_SYMBOL (name):			\
 | 
						|
	mov	n,%g1 ;			\
 | 
						|
	ta	SYSCALL_TRAP ;		\
 | 
						|
	bcc	noerr ;			\
 | 
						|
	sethi	%hi (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;		\
 | 
						|
	or	%g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;	\
 | 
						|
	jmpl	%g1+%g0,%g0 ;		\
 | 
						|
	nop ;				\
 | 
						|
noerr:					\
 | 
						|
	jmpl	%o7+8,%g0 ;		\
 | 
						|
	nop
 | 
						|
 | 
						|
/* Support for reentrant syscalls.  The "struct _reent *" arg is always the
 | 
						|
   the first one.  After that we allow up to four additional args.  We could
 | 
						|
   allow more, but that's all we need for now.
 | 
						|
 | 
						|
   It may seem inefficient to have the reent arg be the first one as it means
 | 
						|
   copying all the other args into place (as opposed to making the reent arg
 | 
						|
   the last one in which case there wouldn't be any copying).  I chose a clean
 | 
						|
   design over an extra four instructions in a system call.  All other
 | 
						|
   reentrant functions use the first arg this way.
 | 
						|
   ??? Of course this scheme breaks down if we need to support 6 or more args.
 | 
						|
 | 
						|
   And of course the system calls aren't *really* reentrant.  The intent
 | 
						|
   is to exercise the reentrancy framework rather than provide/claim
 | 
						|
   real reentrancy for this port.
 | 
						|
*/
 | 
						|
 | 
						|
#define defsyscall_r(name, n) \
 | 
						|
	TEXT_SECTION ;			\
 | 
						|
	ALIGN (4) ;			\
 | 
						|
	GLOBAL (ASM_SYMBOL (name)) ;	\
 | 
						|
ASM_SYMBOL (name):			\
 | 
						|
	mov	n,%g1 ;			\
 | 
						|
	mov	%o0,%o5 ;		\
 | 
						|
	mov	%o1,%o0 ;		\
 | 
						|
	mov	%o2,%o1 ;		\
 | 
						|
	mov	%o3,%o2 ;		\
 | 
						|
	mov	%o4,%o3 ;		\
 | 
						|
	ta	SYSCALL_TRAP ;		\
 | 
						|
	bcc	noerr ;			\
 | 
						|
	sethi	%hi (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ;	\
 | 
						|
	or	%g1,%lo (ASM_PRIVATE_SYMBOL (cerror_r)),%g1 ;	\
 | 
						|
	jmpl	%g1+%g0,%g0 ;		\
 | 
						|
	mov	%o5,%o1 ;		\
 | 
						|
noerr:					\
 | 
						|
	jmpl	%o7+8,%g0 ;		\
 | 
						|
	nop
 | 
						|
 | 
						|
#define seterrno() \
 | 
						|
	sethi	%hi (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;		\
 | 
						|
	or	%g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1 ;	\
 | 
						|
	jmpl	%g1+%g0,%g0 ;		\
 | 
						|
	nop
 | 
						|
 | 
						|
#endif /* _SYSCALLASM_H_ */
 |