; bsd syscalls
;---------------------------------------------------------------------------
;  "THE BEER-WARE LICENSE"(EN) (Revision 42):
;  <dryobates@poczta.onet.pl> wrote this file. As long as you retain this
;  notice you can do whatever you want with this stuff. If we meet some day,
;  and you think this stuff is worth it, you can buy me a beer in return
;  Jakub "Dryobates" Stolarski
;---------------------------------------------------------------------------

;NOTE: sys.* functions don't do error check, but balance stack. If you need do error checking or make your own stack chcecking use sysem SYS_# instead
;nc = not checked in practice by me
;types:
;[M]	    MP-safe system call
;STD	    always included
;COMPAT	    included on COMPAT #ifdef
;COMPAT4    included on COMPAT4 #ifdef (FreeBSD 4 compat)
;LIBCOMPAT  included on COMPAT #ifdef, and placed in syscall.h
;OBSOL	    obsolete, not included in system, only specifies name
;UNIMPL	    not implemented, placeholder only
;NOSTD	    implemented but as a lkm that can be statically			compiled in sysent entry will be filled with lkmsys so the SYSCALL_MODULE macro works

; open modes
O_ACCMODE		= 0003o
O_RDONLY		= 0000o
O_WRONLY		= 0001o
O_RDWR			= 0002o
O_CREAT			= 0100o
O_EXCL			= 0200o
O_NOCTTY		= 0400o
O_TRUNC			= 1000o
O_APPEND		= 2000o
O_NONBLOCK		= 4000o

; access flags
S_ISUID			= 4000o
S_ISGID			= 2000o
S_ISVTX			= 1000o
S_IRUSR			= 0400o
S_IWUSR			= 0200o
S_IXUSR			= 0100o
S_IRGRP			= 0040o
S_IWGRP			= 0020o
S_IXGRP			= 0010o
S_IROTH			= 0004o
S_IWOTH			= 0002o
S_IXOTH			= 0001o

; standard file descriptors
STDIN			= 0
STDOUT			= 1
STDERR			= 2

; mmap flags
PROT_NONE		= 0
PROT_READ		= 1
PROT_WRITE		= 2
PROT_EXEC		= 4

; sharing types
MAP_SHARED		= 0001h	; share changes
MAP_PRIVATE		= 0002h	; changes are private

; mapping type
MAP_FILE		= 0000h	; map from file (default)
MAP_ANON		= 1000h	; allocate from memory, swap space

MSTD_nosys		= 0
MSTD_exit		= 1
MSTD_fork		= 2 
MSTD_read		= 3
MSTD_write		= 4
MSTD_open		= 5
MSTD_close		= 6
MSTD_wait4		= 7
MCOMPAT_creat		= 8
MSTD_link		= 9
MSTD_unlink		= 10
OBSOL_execv		= 11
STD_chdir		= 12
STD_fchdir		= 13
STD_mknod		= 14
STD_chmod		= 15
STD_chown		= 16
MSTD_obreak		= 17
COMPAT4_getfsstat	= 18
COMPAT_lseek		= 19
MSTD_getpid		= 20
STD_mount		= 21
STD_unmount		= 22
MSTD_setuid		= 23
MSTD_getuid		= 24
MSTD_geteuid		= 25
MSTD_ptrace		= 26
MSTD_recvmsg		= 27
MSTD_sendmsg		= 28
MSTD_recvfrom		= 29
MSTD_accept		= 30
MSTD_getpeername	= 31
MSTD_getsockname	= 32
STD_access		= 33
STD_chflags		= 34
STD_fchflags		= 35
STD_sync		= 36
MSTD_kill		= 37
COMPAT_stat		= 38
MSTD_getppid		= 39
COMPAT_lstat		= 40
MSTD_dup		= 41
MSTD_pipe		= 42
MSTD_getegid		= 43
MSTD_profil		= 44
MSTD_ktrace		= 45
MCOMPAT_sigaction	= 46
MSTD_getgid		= 47
MCOMPAT_sigprocmask	= 48
MSTD_getlogin		= 49
MSTD_setlogin		= 50
MSTD_acct		= 51
MCOMPAT_sigpending	= 52
MSTD_sigaltstack	= 53
MSTD_ioctl		= 54
MSTD_reboot		= 55
STD_revoke		= 56
STD_symlink		= 57
STD_readlink		= 58
MSTD_execve		= 59
MSTD_umask		= 60
STD_chroot		= 61
MCOMPAT_fstat		= 62
MCOMPAT_getkerninfo	= 63
MCOMPAT_getpagesize	= 64
MSTD_msync		= 65
MSTD_vfork		= 66
OBSOL_vread		= 67
OBSOL_vwrite		= 68
MSTD_sbrk		= 69
MSTD_sstk		= 70
MCOMPAT_mmap		= 71
MSTD_ovadvise		= 72
MSTD_munmap		= 73
MSTD_mprotect		= 74
MSTD_madvise		= 75
OBSOL_vhangup		= 76
OBSOL_vlimit		= 77
MSTD_mincore		= 78
MSTD_getgroups		= 79
MSTD_setgroups		= 80
MSTD_getpgrp		= 81
MSTD_setpgid		= 82
MSTD_setitimer		= 83
MCOMPAT_wait		= 84
MSTD_swapon		= 85
MSTD_getitimer		= 86
MCOMPAT_gethostname	= 87
MCOMPAT_sethostname	= 88
MSTD_getdtablesize	= 89
MSTD_dup2		= 90
UNIMPL_getdopt		= 91
MSTD_fcntl		= 92
MSTD_select		= 93
UNIMPL_setdopt		= 94
STD_fsync		= 95
MSTD_setpriority	= 96
MSTD_socket		= 97
MSTD_connect		= 98
MCPT_NOA_accept		= 99
MSTD_getpriority	= 100
MCOMPAT_send		= 101
MCOMPAT_recv		= 102
MCOMPAT_sigreturn	= 103
MSTD_bind		= 104
MSTD_setsockopt		= 105
MSTD_listen		= 106
OBSOL_vtimes		= 107
MCOMPAT_sigvec		= 108
MCOMPAT_sigblock	= 109
MCOMPAT_sigsetmask	= 110
MCOMPAT_sigsuspend	= 111
MCOMPAT_sigstack	= 112
MCOMPAT_recvmsg		= 113
MCOMPAT_sendmsg		= 114
OBSOL_vtrace		= 115
MSTD_gettimeofday	= 116
MSTD_getrusage		= 117
MSTD_getsockopt		= 118
UNIMPL_resuba		= 119 
MSTD_readv		= 120 
MSTD_writev		= 121 
MSTD_settimeofday	= 122 
STD_fchown		= 123 
STD_fchmod		= 124 
MCPT_NOA_recvfrom	= 125 
MSTD_setreuid		= 126 
MSTD_setregid		= 127 
STD_rename		= 128 
COMPAT_truncate		= 129 
COMPAT_ftruncate	= 130 
MSTD_flock		= 131 
STD_mkfifo		= 132 
MSTD_sendto		= 133 
MSTD_shutdown		= 134 
MSTD_socketpair		= 135 
STD_mkdir		= 136 
STD_rmdir		= 137 
STD_utimes		= 138 
OBSOL_sigreturn		= 139 
MSTD_adjtime		= 140 
MCOMPAT_getpeername	= 141 
MCOMPAT_gethostid	= 142 
MCOMPAT_sethostid	= 143 
MCOMPAT_getrlimit	= 144 
MCOMPAT_setrlimit	= 145 
MCOMPAT_killpg		= 146 
MSTD_setsid		= 147 
STD_quotactl		= 148 
MCOMPAT_quota		= 149 
MCPT_NOA_getsockname	= 150 
UNIMPL_sem_lock 	= 151 
UNIMPL_sem_wakeup  	= 152 
UNIMPL_asyncdaemon   	= 153 
UNIMPL_nosys   		= 154 
MNOIMPL_nfssvc   	= 155 
COMPAT_getdirentries   	= 156 
COMPAT4_statfs   	= 157 
COMPAT4_fstatfs   	= 158 
UNIMPL_nosys   		= 159 
STD_lgetfh   		= 160 
STD_getfh   		= 161 
MSTD_getdomainname   	= 162 
MSTD_setdomainname   	= 163 
MSTD_uname   		= 164 
MSTD_sysarch   		= 165 
MSTD_rtprio   		= 166 
UNIMPL_nosys   		= 167 
UNIMPL_nosys   		= 168 
MNOSTD_semsys   	= 169 
MNOSTD_msgsys   	= 170 
MNOSTD_shmsys   	= 171 
UNIMPL_nosys   		= 172 
MSTD_pread   		= 173 
MSTD_pwrite   		= 174 
UNIMPL_nosys   		= 175 
MSTD_ntp_adjtime   	= 176 
UNIMPL_sfork    	= 177 
UNIMPL_getdescriptor   	= 178 
UNIMPL_setdescriptor	= 179 
UNIMPL_nosys      	= 180 
MSTD_setgid      	= 181 
MSTD_setegid      	= 182 
MSTD_seteuid      	= 183 
UNIMPL_lfs_bmapv      	= 184 
UNIMPL_lfs_markv      	= 185 
UNIMPL_lfs_segclean     = 186 
UNIMPL_lfs_segwait      = 187 
STD_stat      		= 188 
MSTD_fstat      	= 189 
STD_lstat      		= 190 
STD_pathconf      	= 191 
MSTD_fpathconf      	= 192 
UNIMPL_nosys      	= 193 
MSTD_getrlimit      	= 194 
MSTD_setrlimit      	= 195 
STD_getdirentries      	= 196 
MSTD_mmap		= 197
STD_nosys		= 198
STD_lseek		= 199
STD_truncate		= 200
STD_ftruncate		= 201
MSTD_sysctl		= 202
MSTD_mlock		= 203
MSTD_munlock		= 204
STD_undelete		= 205
STD_futimes		= 206
MSTD_getpgid		= 207
UNIMPL_newreboot	= 208
MSTD_pool		= 209

kernel:
	int 80h
	ret

macro system function_number {
	mov	    eax, function_number
	call	    kernel
}

; 1 void sys_exit(int rval);
macro sys.exit rval {
	push	    rval
	system	    SYS_exit
	add	    esp, 4		; we don't need that, but if someone look for exemple, let hi see good looking code
}

; 2 int fork(void); nc
macro sys.fork {
	system  SYS_fork
}

; 3 ssize_t read(int fd, void *buf, size_t nbyte);
macro sys.read fd, buf, nbyte {
	push	    nbyte
	push	    buf
	push	    fd
	system	    SYS_read
	add	    esp, 3*4
}

; 4 ssize_t write(int fd, const void *buf, size_t nbyte);
macro sys.write fd, buf, nbyte {
	push	    nbyte
	push	    buf
	push	    fd
	system	    SYS_write
	add	    esp, 3*4
}

; 5 int open(char *path, int flags, int mode); 
macro sys.open path, flags, mode {
	push	    mode
	push	    flags
	push	    path
	system	    SYS_open
	add	    esp, 3*4
}

; 6 int close(int fd); 
macro sys.close fd {
	push	    fd
	system	    SYS_close
	add	    esp, 4
}

; 69 int sbrk(int incr); nc
macro sys.sbrk incr {
	push	    incr
	system	    SYS_sbrk
	add	    esp, 4
}
; 116 int gettimeofday(struct timeval *tp, struct timezone *tzp);
macro sys.gettimeofday tp, tzp {
	push	    tzp
	push	    tp
	system	    SYS_gettimeofday
	add	    esp, 2*4
}
; 197 caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos);
macro sys.mmap addr, len, prot, flags, fd, pad, pos1, pos2 {
	push	    pos2		;64-bit offset = pos2 shl 4 + pos1
	push	    pos1
	push	    pad
	push	    fd
	push	    flags
	push	    prot
	push	    len
	push	    addr
	system	    SYS_mmap
	add	    esp, 8*4
}

; 199 off_t lseek(int fd, int pad, off_t offset, int whence);
macro sys.lseek fd, pad, offset1, offset2, whence {
	push	    whence
	push	    offset2
	push	    offset1
	push	    pad
	push	    fd
	system	    SYS_lseek
	add	    esp, 5*4
}
