[comp.unix.aux] syscall equivalent

cstruble@geech.ai.mit.edu (Craig Struble) (03/09/91)

I'm working on compiling SB prolog for A/UX 2.0 so the students at Va. Tech
aren't forced into using a VAX VMS machine to do their prolog work. Much to
my dismay, SB Prolog uses syscall and I don't know what the A/UX equivalent
would be. Does anyone out there know what the equivalent for syscall is for
A/UX 2.0?
	See ya later,
		Craig
		cstruble@pogo.ai.mit.edu



--
Craig Struble                           Sysop of The Toaster (703)951-4308
Va. Tech student			Mac and A/UX support
cstruble@vttcf.cc.vt.edu		Fidonet (1:151/118.1)
cstruble@pogo.ai.mit.edu

coolidge@cs.uiuc.edu (John Coolidge) (03/10/91)

cstruble@geech.ai.mit.edu (Craig Struble) writes:
>I'm working on compiling SB prolog for A/UX 2.0 so the students at Va. Tech
>aren't forced into using a VAX VMS machine to do their prolog work. Much to
>my dismay, SB Prolog uses syscall and I don't know what the A/UX equivalent
>would be. Does anyone out there know what the equivalent for syscall is for
>A/UX 2.0?

The good news: syscall() _is_ included in libc.a on A/UX 2.0 (and it
seems to work, too, based on a few tests I just ran). The bad news: A/UX
does not include syscall.h, which is necessary to use syscall. So,
needing syscall, I went out and built a working syscall.h (:-)) which
I'll append to this posting.

For those who don't know, syscall(2) is a way to make a given system
call without going through the normal interface; it's useful if you want
to override a given system call (for instrumentation, adding a wrapper,
etc). I know at least xview and, now, SB Prolog need it; perl will use
it if you've got it.

Notes on syscall under A/UX: there are two major methods of getting
parameters into the kernel --- stack-based parameter passing and
register parameters. As far as I can tell, these use different traps and
are thus distinguishable; therefore, those that use regparms in the
standard libc can go through the syscall that's in libc (which only does
stack parameters) and still work. I'm not sure why there's a difference,
unless regparms are faster and someone has half-switched libc over. At
any rate, I've tried several of the regparm-style syscalls with
syscall() from libc and they work correctly.

My syscall.h is annotated with which sort of parameter passing a given
routine uses (well, it's actually cryptic: "normal" means stack-based,
"regparm x y" means register parameters with x arguments and y
registers needing saving before they're clobbered with a parameter, and
"strange" can mean just about anything :-)). There are several traps
used for more than one syscall; these are marked "also" --- at the
moment I haven't added extra #defines for them, although I probably
should.

As a challenge to myself, and to help prove that I've figured out how
libc is passing things, I've got a complete reimplementation of all the
section 2 calls except the shm/sem/mem calls written (assembly source
and all that); I'll probably put it out Real Soon Now (it's really not
much use since you've already got libc, unless you want to hack some
strange low-level behavior or are interested in how Unix passes things
into the kernel).

Believe it or not, almost all this is actually useful for my thesis
research :-).

--John

--------------------------------- syscall.h ---------------------------------
#ifndef _sys_syscall_h
#define _sys_syscall_h

#define SYS_exit	1 /* Strange */
#define SYS_fork	2 /* Strange */
#define SYS_read	3 /* Normal */
#define SYS_write	4 /* Normal */
#define SYS_open	5 /* Normal */
#define SYS_close	6 /* Strange */
#define SYS_wait	7 /* Strange */ /* Also wait3 */
#define SYS_creat	8 /* Normal */
#define SYS_link	9 /* Normal */
#define SYS_unlink	10 /* Normal */
#define SYS_chdir	12 /* Normal */
#define SYS_time	13 /* Strange */
#define SYS_mknod	14 /* Normal */
#define SYS_chmod	15 /* Normal */
#define SYS_chown	16 /* Normal */
#define SYS_brk		17	/* Strange */ /* Also sbrk */
#define SYS_lseek	19 /* Normal */
#define SYS_getpid	20 /* Strange */ /* Also getppid */
#define SYS_unmount	22	/* Normal */
#define SYS_getuid	24 /* Strange */ /* Also geteuid */
#define SYS_stime	25 /* Strange */
#define SYS_ptrace	26 /* Normal */
#define SYS_alarm	27 /* Normal */
#define SYS_pause	29 /* Normal */
#define SYS_utime	30 /* Normal */
#define SYS_access	33 /* Normal */
#define SYS_nice	34 /* Normal */
#define SYS_sync	36 /* Strange */
#define SYS_kill	37 /* Normal */
#define SYS_setpgrp	39 /* Strange */ /* Also getpgrp */
#define SYS_dup		41 /* Normal */
#define SYS_pipe	42 /* Strange */
#define SYS_times	43 /* Normal */
#define SYS_profil	44 /* Normal */
#define SYS_plock	45 /* Normal */
#define SYS_getgid	47 /* Strange */ /* Also getegid */
#define SYS_signal	48 /* Normal */
#define SYS_msgsys	49	/* Strange */ /*FIX*/
#define SYS_acct	51 /* Normal */
#define SYS_shmsys	52	/* Strange */ /*FIX*/
#define SYS_semsys	53	/* Strange */ /*FIX*/
#define SYS_ioctl	54 /* Normal */
#define SYS_phys	55	/* Normal */
#define SYS_locking	56	/* Normal */
#define SYS_uinfo	57	/* Strange */ /* Handles ustat uname uvar */
#define SYS_execve	59	/* Strange */
#define SYS_umask	60 /* Normal */
#define SYS_chroot	61 /* Normal */
#define SYS_fcntl	62 /* Normal */
#define SYS_ulimit	63 /* Normal */
#define SYS_reboot	64	/* Normal */
#define SYS_slotmgr	66	/* Strange */
#define SYS_swapmmumode	67	/* Normal */
#define SYS_accept	70	/* Regparm - 3 0 */
#define SYS_bind	71	/* Regparm - 3 0 */
#define SYS_connect	72	/* Regparm - 3 0 */
#define SYS_gethostid	73	/* Regparm - 0 0 */
#define SYS_gethostname	74	/* Regparm - 2 0 */
#define SYS_getpeername	75	/* Regparm - 3 0 */
#define SYS_getsockname	76	/* Regparm - 2 0 */
#define SYS_getsockopt	77	/* Regparm - 5 2 */
#define	SYS_listen	78	/* Regparm - 2 0 */
#define SYS_recv	79	/* Regparm - 4 1 */
#define SYS_recvfrom	80	/* Regparm - 6 3 */
#define SYS_recvmsg	81	/* Regparm - 3 0 */
#define	SYS_select	82	/* Regparm - 5 2 */
#define SYS_send	83	/* Regparm - 4 1 */
#define SYS_sendmsg	84	/* Regparm - 3 0 */
#define SYS_sendto	85	/* Regparm - 6 3 */
#define SYS_sethostid	86	/* Regparm - 1 0 */
#define SYS_sethostname	87	/* Regparm - 2 0 */
#define SYS_setregid	88	/* Regparm - 2 0 */
#define SYS_setreuid	89	/* Regparm - 2 0 */
#define SYS_setsockopt	90	/* Regparm - 5 2 */
#define SYS_shutdown	91	/* Regparm - 2 0 */
#define SYS_socket	92	/* Regparm - 3 0 */
#define SYS_socketpair	93	/* Regparm - 4 1 */
#define SYS_getdomainname	100	/* Regparm - 2 0 */
#define SYS_setdomainname	101	/* Regparm - 2 0 */
#define SYS_getgroups	102	/* Regparm - 2 0 */
#define SYS_setgroups	103	/* Regparm - 2 0 */
#define SYS_getdtablesize	104	/* Regparm - 0 0 */
#define SYS_flock	105	/* Regparm - 2 0 */
#define SYS_readv	106	/* Regparm - 3 0 */
#define SYS_writev	107	/* Regparm - 3 0 */
#define SYS_mkdir	108	/* Regparm - 2 0 */
#define SYS_rmdir	109	/* Regparm - 1 0 */
#define SYS_getdirentries	110	/* Regparm - 4 1 */
#define SYS_lstat	111	/* Regparm - 2 0 */
#define SYS_symlink	112	/* Regparm - 2 0 */
#define SYS_readlink	113	/* Regparm - 3 0 */
#define SYS_truncate	114	/* Regparm - 2 0 */
#define SYS_ftruncate	115	/* Regparm - 2 0 */
#define SYS_fsync	116	/* Regparm - 1 0 */
#define SYS_statfs	117	/* Regparm - 2 0 */
#define SYS_fstatfs	118	/* Regparm - 2 0 */
#define SYS_async_daemon	119	/* Regparm - 0 0 */
#define SYS_nfs_svc	121	/* Regparm - 1 0 */
#define SYS_nfs_getfh	122	/* Regparm - 2 0 */
#define SYS_rename	123	/* Regparm - 2 0 */
#define SYS_fstat	124	/* Regparm - 2 0 */
#define SYS_stat	125	/* Regparm - 2 0 */
#define SYS_getcompat	127	/* Regparm - 0 0 */
#define SYS_setcompat	128	/* Strange (1 0 + set42sig) */
#define SYS_vtrace	128	/* Regparm - 2 0 */
#define SYS_sigvec	129	/* Regparm - 3 0 */
#define SYS_sigblock	130	/* Regparm - 1 0 */
#define SYS_sigsetmask	131	/* Regparm - 1 0 */
#define SYS_sigpause	132	/* Regparm - 1 0 */
#define SYS_sigstack	133	/* Regparm - 2 0 */
#define SYS_getitimer	134	/* Regparm - 2 0 */
#define SYS_setitimer	135	/* Regparm - 3 0 */
#define SYS_gettimeofday	136	/* Regparm - 1 0 */
#define SYS_settimeofday	137	/* Regparm - 1 0 */
#define SYS_adjtime	138 /* Regparm - 2 0 */
#define SYS_fsmount	141	/* Regparm - 4 1 */
#define SYS_umount	142 /* Normal */
#define SYS_fchmod	143	/* Regparm - 2 0 */
#define SYS_fchown	144	/* Regparm - 3 0 */
#define SYS_setsid	145	/* Regparm - 0 0 */
#define SYS_utimes	145	/* Regparm - 2 0 */
#define SYS_setpgid	147	/* Regparm - 2 0 */
#define SYS_getcterm	148	/* Regparm - 0 0 */
#define SYS_sigpending	149	/* Regparm - 1 0 */
#define SYS_waitpid	151	/* Strange (3 0 + status stuff) */

#endif _sys_syscall_h