summaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2008-07-26 14:49:21 -0700
committerRob Pike <r@golang.org>2008-07-26 14:49:21 -0700
commit4fe776ac43991af527c76f921e040e76d34f9fe0 (patch)
tree82b1a495d349b8e025dab2d7ab72a28e9d689473 /src/syscall
parente1ce25796bc751374701246042f1070b2714c8a4 (diff)
downloadgo-4fe776ac43991af527c76f921e040e76d34f9fe0.tar.gz
beginnings of a low-level syscall library
R=ken OCL=13483 CL=13496
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/Makefile41
-rw-r--r--src/syscall/errstr_darwin.go354
-rw-r--r--src/syscall/errstr_linux.go428
-rw-r--r--src/syscall/syscall.go15
-rw-r--r--src/syscall/syscall_amd64_darwin.s107
-rw-r--r--src/syscall/syscall_amd64_linux.s123
6 files changed, 1068 insertions, 0 deletions
diff --git a/src/syscall/Makefile b/src/syscall/Makefile
new file mode 100644
index 000000000..fc21794c7
--- /dev/null
+++ b/src/syscall/Makefile
@@ -0,0 +1,41 @@
+# Copyright 2009 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+CFLAGS=
+O=6
+CC=$(O)c
+AS=$(O)a
+GC=$(O)g
+
+PKG=syscall.a
+
+OFILES=\
+ syscall.$O \
+ errstr_$(GOOS).$O \
+ syscall_$(GOARCH)_$(GOOS).$O \
+
+
+install: $(PKG)
+ cp $(PKG) $(GOROOT)/pkg
+
+$(PKG): $(OFILES)
+ $(O)ar grc $(PKG) $(OFILES)
+
+nuke:
+ rm -f *.$(O) *.a $(GOROOT)/lib/$(PKG)
+
+clean:
+ rm -f *.$(O) *.a
+
+%.$O: %.c
+ $(CC) $<
+
+sys_file.$O: sys_file.c sys_types.h $(OS_H)
+ $(CC) -D$(GOARCH)_$(GOOS) $<
+
+%.$O: %.s
+ $(AS) $<
+
+%.$O: %.go
+ $(GC) $<
diff --git a/src/syscall/errstr_darwin.go b/src/syscall/errstr_darwin.go
new file mode 100644
index 000000000..aac256909
--- /dev/null
+++ b/src/syscall/errstr_darwin.go
@@ -0,0 +1,354 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+export errstr
+
+const (
+ ENONE=0;
+ EPERM=1;
+ ENOENT=2;
+ ESRCH=3;
+ EINTR=4;
+ EIO=5;
+ ENXIO=6;
+ E2BIG=7;
+ ENOEXEC=8;
+ EBADF=9;
+ ECHILD=10;
+ EDEADLK=11;
+ ENOMEM=12;
+ EACCES=13;
+ EFAULT=14;
+ ENOTBLK=15;
+ EBUSY=16;
+ EEXIST=17;
+ EXDEV=18;
+ ENODEV=19;
+ ENOTDIR=20;
+ EISDIR=21;
+ EINVAL=22;
+ ENFILE=23;
+ EMFILE=24;
+ ENOTTY=25;
+ ETXTBSY=26;
+ EFBIG=27;
+ ENOSPC=28;
+ ESPIPE=29;
+ EROFS=30;
+ EMLINK=31;
+ EPIPE=32;
+ EDOM=33;
+ ERANGE=34;
+ EAGAIN=35;
+ EINPROGRESS=36;
+ EALREADY=37;
+ ENOTSOCK=38;
+ EDESTADDRREQ=39;
+ EMSGSIZE=40;
+ EPROTOTYPE=41;
+ ENOPROTOOPT=42;
+ EPROTONOSUPPORT=43;
+ ESOCKTNOSUPPORT=44;
+ ENOTSUP=45;
+ EPFNOSUPPORT=46;
+ EAFNOSUPPORT=47;
+ EADDRINUSE=48;
+ EADDRNOTAVAIL=49;
+ ENETDOWN=50;
+ ENETUNREACH=51;
+ ENETRESET=52;
+ ECONNABORTED=53;
+ ECONNRESET=54;
+ ENOBUFS=55;
+ EISCONN=56;
+ ENOTCONN=57;
+ ESHUTDOWN=58;
+ ETOOMANYREFS=59;
+ ETIMEDOUT=60;
+ ECONNREFUSED=61;
+ ELOOP=62;
+ ENAMETOOLONG=63;
+ EHOSTDOWN=64;
+ EHOSTUNREACH=65;
+ ENOTEMPTY=66;
+ EPROCLIM=67;
+ EUSERS=68;
+ EDQUOT=69;
+ ESTALE=70;
+ EREMOTE=71;
+ EBADRPC=72;
+ ERPCMISMATCH=73;
+ EPROGUNAVAIL=74;
+ EPROGMISMATCH=75;
+ EPROCUNAVAIL=76;
+ ENOLCK=77;
+ ENOSYS=78;
+ EFTYPE=79;
+ EAUTH=80;
+ ENEEDAUTH=81;
+ EPWROFF=82;
+ EDEVERR=83;
+ EOVERFLOW=84;
+ EBADEXEC=85;
+ EBADARCH=86;
+ ESHLIBVERS=87;
+ EBADMACHO=88;
+ ECANCELED=89;
+ EIDRM=90;
+ ENOMSG=91 ;
+ EILSEQ=92;
+ ENOATTR=93;
+ EBADMSG=94;
+ EMULTIHOP=95;
+ ENODATA=96;
+ ENOLINK=97;
+ ENOSR=98;
+ ENOSTR=99;
+ EPROTO=100;
+ ETIME=101;
+ EOPNOTSUPP=102;
+ ELAST=103;
+)
+
+export (
+ ENONE,
+ EPERM,
+ ENOENT,
+ ESRCH,
+ EINTR,
+ EIO,
+ ENXIO,
+ E2BIG,
+ ENOEXEC,
+ EBADF,
+ ECHILD,
+ EDEADLK,
+ ENOMEM,
+ EACCES,
+ EFAULT,
+ ENOTBLK,
+ EBUSY,
+ EEXIST,
+ EXDEV,
+ ENODEV,
+ ENOTDIR,
+ EISDIR,
+ EINVAL,
+ ENFILE,
+ EMFILE,
+ ENOTTY,
+ ETXTBSY,
+ EFBIG,
+ ENOSPC,
+ ESPIPE,
+ EROFS,
+ EMLINK,
+ EPIPE,
+ EDOM,
+ ERANGE,
+ EAGAIN,
+ EINPROGRESS,
+ EALREADY,
+ ENOTSOCK,
+ EDESTADDRREQ,
+ EMSGSIZE,
+ EPROTOTYPE,
+ ENOPROTOOPT,
+ EPROTONOSUPPORT,
+ ESOCKTNOSUPPORT,
+ ENOTSUP,
+ EPFNOSUPPORT,
+ EAFNOSUPPORT,
+ EADDRINUSE,
+ EADDRNOTAVAIL,
+ ENETDOWN,
+ ENETUNREACH,
+ ENETRESET,
+ ECONNABORTED,
+ ECONNRESET,
+ ENOBUFS,
+ EISCONN,
+ ENOTCONN,
+ ESHUTDOWN,
+ ETOOMANYREFS,
+ ETIMEDOUT,
+ ECONNREFUSED,
+ ELOOP,
+ ENAMETOOLONG,
+ EHOSTDOWN,
+ EHOSTUNREACH,
+ ENOTEMPTY,
+ EPROCLIM,
+ EUSERS,
+ EDQUOT,
+ ESTALE,
+ EREMOTE,
+ EBADRPC,
+ ERPCMISMATCH,
+ EPROGUNAVAIL,
+ EPROGMISMATCH,
+ EPROCUNAVAIL,
+ ENOLCK,
+ ENOSYS,
+ EFTYPE,
+ EAUTH,
+ ENEEDAUTH,
+ EPWROFF,
+ EDEVERR,
+ EOVERFLOW,
+ EBADEXEC,
+ EBADARCH,
+ ESHLIBVERS,
+ EBADMACHO,
+ ECANCELED,
+ EIDRM,
+ ENOMSG,
+ EILSEQ,
+ ENOATTR,
+ EBADMSG,
+ EMULTIHOP,
+ ENODATA,
+ ENOLINK,
+ ENOSR,
+ ENOSTR,
+ EPROTO,
+ ETIME,
+ EOPNOTSUPP,
+ ELAST
+)
+
+var error [ELAST]string;
+
+func init(){
+ error[ENONE] = "No error";
+ error[EPERM] = "Operation not permitted";
+ error[ENOENT] = "No such file or directory";
+ error[ESRCH] = "No such process";
+ error[EINTR] = "Interrupted system call";
+ error[EIO] = "Input/output error";
+ error[ENXIO] = "Device not configured";
+ error[E2BIG] = "Argument list too long";
+ error[ENOEXEC] = "Exec format error";
+ error[EBADF] = "Bad file descriptor";
+ error[ECHILD] = "No child processes";
+ error[EDEADLK] = "Resource deadlock avoided";
+ error[ENOMEM] = "Cannot allocate memory";
+ error[EACCES] = "Permission denied";
+ error[EFAULT] = "Bad address";
+ error[ENOTBLK] = "Block device required";
+ error[EBUSY] = "Device / Resource busy";
+ error[EEXIST] = "File exists";
+ error[EXDEV] = "Cross-device link";
+ error[ENODEV] = "Operation not supported by device";
+ error[ENOTDIR] = "Not a directory";
+ error[EISDIR] = "Is a directory";
+ error[EINVAL] = "Invalid argument";
+ error[ENFILE] = "Too many open files in system";
+ error[EMFILE] = "Too many open files";
+ error[ENOTTY] = "Inappropriate ioctl for device";
+ error[ETXTBSY] = "Text file busy";
+ error[EFBIG] = "File too large";
+ error[ENOSPC] = "No space left on device";
+ error[ESPIPE] = "Illegal seek";
+ error[EROFS] = "Read-only file system";
+ error[EMLINK] = "Too many links";
+ error[EPIPE] = "Broken pipe";
+ error[EDOM] = "Numerical argument out of domain";
+ error[ERANGE] = "Result too large";
+ error[EAGAIN] = "Resource temporarily unavailable";
+ error[EINPROGRESS] = "Operation now in progress";
+ error[EALREADY] = "Operation already in progress";
+ error[ENOTSOCK] = "Socket operation on non-socket";
+ error[EDESTADDRREQ] = "Destination address required";
+ error[EMSGSIZE] = "Message too long";
+ error[EPROTOTYPE] = "Protocol wrong type for socket";
+ error[ENOPROTOOPT] = "Protocol not available";
+ error[EPROTONOSUPPORT] = "Protocol not supported";
+ error[ESOCKTNOSUPPORT] = "Socket type not supported";
+ error[ENOTSUP] = "Operation not supported";
+ error[EPFNOSUPPORT] = "Protocol family not supported";
+ error[EAFNOSUPPORT] = "Address family not supported by protocol family";
+ error[EADDRINUSE] = "Address already in use";
+ error[EADDRNOTAVAIL] = "Can't assign requested address";
+ error[ENETDOWN] = "Network is down";
+ error[ENETUNREACH] = "Network is unreachable";
+ error[ENETRESET] = "Network dropped connection on reset";
+ error[ECONNABORTED] = "Software caused connection abort";
+ error[ECONNRESET] = "Connection reset by peer";
+ error[ENOBUFS] = "No buffer space available";
+ error[EISCONN] = "Socket is already connected";
+ error[ENOTCONN] = "Socket is not connected";
+ error[ESHUTDOWN] = "Can't send after socket shutdown";
+ error[ETOOMANYREFS] = "Too many references: can't splice";
+ error[ETIMEDOUT] = "Operation timed out";
+ error[ECONNREFUSED] = "Connection refused";
+ error[ELOOP] = "Too many levels of symbolic links";
+ error[ENAMETOOLONG] = "File name too long";
+ error[EHOSTDOWN] = "Host is down";
+ error[EHOSTUNREACH] = "No route to host";
+ error[ENOTEMPTY] = "Directory not empty";
+ error[EPROCLIM] = "Too many processes";
+ error[EUSERS] = "Too many users";
+ error[EDQUOT] = "Disc quota exceeded";
+ error[ESTALE] = "Stale NFS file handle";
+ error[EREMOTE] = "Too many levels of remote in path";
+ error[EBADRPC] = "RPC struct is bad";
+ error[ERPCMISMATCH] = "RPC version wrong";
+ error[EPROGUNAVAIL] = "RPC prog. not avail";
+ error[EPROGMISMATCH] = "Program version wrong";
+ error[EPROCUNAVAIL] = "Bad procedure for program";
+ error[ENOLCK] = "No locks available";
+ error[ENOSYS] = "Function not implemented";
+ error[EFTYPE] = "Inappropriate file type or format";
+ error[EAUTH] = "Authentication error";
+ error[ENEEDAUTH] = "Need authenticator";
+ error[EPWROFF] = "Device power is off";
+ error[EDEVERR] = "Device error, e.g. paper out";
+ error[EOVERFLOW] = "Value too large to be stored in data type";
+ error[EBADEXEC] = "Bad executable";
+ error[EBADARCH] = "Bad CPU type in executable";
+ error[ESHLIBVERS] = "Shared library version mismatch";
+ error[EBADMACHO] = "Malformed Macho file";
+ error[ECANCELED] = "Operation canceled";
+ error[EIDRM] = "Identifier removed";
+ error[ENOMSG] = "No message of desired type";
+ error[EILSEQ] = "Illegal byte sequence";
+ error[ENOATTR] = "Attribute not found";
+ error[EBADMSG] = "Bad message";
+ error[EMULTIHOP] = "Reserved";
+ error[ENODATA] = "No message available on STREAM";
+ error[ENOLINK] = "Reserved";
+ error[ENOSR] = "No STREAM resources";
+ error[ENOSTR] = "Not a STREAM";
+ error[EPROTO] = "Protocol error";
+ error[ETIME] = "STREAM ioctl timeout";
+ error[EOPNOTSUPP] = "Operation not supported on socket";
+ error[ELAST] = "Must be equal largest errno";
+}
+
+var digits string = "0123456789"
+
+func str(val int64) string { // do it here rather than with fmt to avoid dependency
+ if val < 0 {
+ return "-" + str(-val);
+ }
+ var buf [32]byte; // big enough for int64
+ i := len(buf)-1;
+ for val >= 10 {
+ buf[i] = digits[val%10];
+ i--;
+ val /= 10;
+ }
+ buf[i] = digits[val];
+ return string(buf)[i:len(buf)];
+}
+
+func errstr(errno int64) string {
+ if errno < 0 || errno >= len(error) {
+ return "Error " + str(errno)
+ }
+ return error[errno]
+}
diff --git a/src/syscall/errstr_linux.go b/src/syscall/errstr_linux.go
new file mode 100644
index 000000000..875217afc
--- /dev/null
+++ b/src/syscall/errstr_linux.go
@@ -0,0 +1,428 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+export errstr
+
+const (
+ ENONE=0;
+ EPERM=1;
+ ENOENT=2;
+ ESRCH=3;
+ EINTR=4;
+ EIO=5;
+ ENXIO=6;
+ E2BIG=7;
+ ENOEXEC=8;
+ EBADF=9;
+ ECHILD=10;
+ EAGAIN=11;
+ ENOMEM=12;
+ EACCES=13;
+ EFAULT=14;
+ ENOTBLK=15;
+ EBUSY=16;
+ EEXIST=17;
+ EXDEV=18;
+ ENODEV=19;
+ ENOTDIR=20;
+ EISDIR=21;
+ EINVAL=22;
+ ENFILE=23;
+ EMFILE=24;
+ ENOTTY=25;
+ ETXTBSY=26;
+ EFBIG=27;
+ ENOSPC=28;
+ ESPIPE=29;
+ EROFS=30;
+ EMLINK=31;
+ EPIPE=32;
+ EDOM=33;
+ ERANGE=34;
+ EDEADLK=35;
+ ENAMETOOLONG=36;
+ ENOLCK=37;
+ ENOSYS=38;
+ ENOTEMPTY=39;
+ ELOOP=40;
+ ENOMSG=42;
+ EIDRM=43;
+ ECHRNG=44;
+ EL2NSYNC=45;
+ EL3HLT=46;
+ EL3RST=47;
+ ELNRNG=48;
+ EUNATCH=49;
+ ENOCSI=50;
+ EL2HLT=51;
+ EBADE=52;
+ EBADR=53;
+ EXFULL=54;
+ ENOANO=55;
+ EBADRQC=56;
+ EBADSLT=57;
+ EBFONT=59;
+ ENOSTR=60;
+ ENODATA=61;
+ ETIME=62;
+ ENOSR=63;
+ ENONET=64;
+ ENOPKG=65;
+ EREMOTE=66;
+ ENOLINK=67;
+ EADV=68;
+ ESRMNT=69;
+ ECOMM=70;
+ EPROTO=71;
+ EMULTIHOP=72;
+ EDOTDOT=73;
+ EBADMSG=74;
+ EOVERFLOW=75;
+ ENOTUNIQ=76;
+ EBADFD=77;
+ EREMCHG=78;
+ ELIBACC=79;
+ ELIBBAD=80;
+ ELIBSCN=81;
+ ELIBMAX=82;
+ ELIBEXEC=83;
+ EILSEQ=84;
+ ERESTART=85;
+ ESTRPIPE=86;
+ EUSERS=87;
+ ENOTSOCK=88;
+ EDESTADDRREQ=89;
+ EMSGSIZE=90;
+ EPROTOTYPE=91;
+ ENOPROTOOPT=92;
+ EPROTONOSUPPORT=93;
+ ESOCKTNOSUPPORT=94;
+ EOPNOTSUPP=95;
+ EPFNOSUPPORT=96;
+ EAFNOSUPPORT=97;
+ EADDRINUSE=98;
+ EADDRNOTAVAIL=99;
+ ENETDOWN=100;
+ ENETUNREACH=101;
+ ENETRESET=102;
+ ECONNABORTED=103;
+ ECONNRESET=104;
+ ENOBUFS=105;
+ EISCONN=106;
+ ENOTCONN=107;
+ ESHUTDOWN=108;
+ ETOOMANYREFS=109;
+ ETIMEDOUT=110;
+ ECONNREFUSED=111;
+ EHOSTDOWN=112;
+ EHOSTUNREACH=113;
+ EALREADY=114;
+ EINPROGRESS=115;
+ ESTALE=116;
+ EUCLEAN=117;
+ ENOTNAM=118;
+ ENAVAIL=119;
+ EISNAM=120;
+ EREMOTEIO=121;
+ EDQUOT=122;
+ ENOMEDIUM=123;
+ EMEDIUMTYPE=124;
+ ECANCELED=125;
+ ENOKEY=126;
+ EKEYEXPIRED=127;
+ EKEYREVOKED=128;
+ EKEYREJECTED=129;
+ ELAST=130;
+)
+
+export (
+ ENONE,
+ EPERM,
+ ENOENT,
+ ESRCH,
+ EINTR,
+ EIO,
+ ENXIO,
+ E2BIG,
+ ENOEXEC,
+ EBADF,
+ ECHILD,
+ EAGAIN,
+ ENOMEM,
+ EACCES,
+ EFAULT,
+ ENOTBLK,
+ EBUSY,
+ EEXIST,
+ EXDEV,
+ ENODEV,
+ ENOTDIR,
+ EISDIR,
+ EINVAL,
+ ENFILE,
+ EMFILE,
+ ENOTTY,
+ ETXTBSY,
+ EFBIG,
+ ENOSPC,
+ ESPIPE,
+ EROFS,
+ EMLINK,
+ EPIPE,
+ EDOM,
+ ERANGE,
+ EDEADLK,
+ ENAMETOOLONG,
+ ENOLCK,
+ ENOSYS,
+ ENOTEMPTY,
+ ELOOP,
+ ENOMSG,
+ EIDRM,
+ ECHRNG,
+ EL2NSYNC,
+ EL3HLT,
+ EL3RST,
+ ELNRNG,
+ EUNATCH,
+ ENOCSI,
+ EL2HLT,
+ EBADE,
+ EBADR,
+ EXFULL,
+ ENOANO,
+ EBADRQC,
+ EBADSLT,
+ EBFONT,
+ ENOSTR,
+ ENODATA,
+ ETIME,
+ ENOSR,
+ ENONET,
+ ENOPKG,
+ EREMOTE,
+ ENOLINK,
+ EADV,
+ ESRMNT,
+ ECOMM,
+ EPROTO,
+ EMULTIHOP,
+ EDOTDOT,
+ EBADMSG,
+ EOVERFLOW,
+ ENOTUNIQ,
+ EBADFD,
+ EREMCHG,
+ ELIBACC,
+ ELIBBAD,
+ ELIBSCN,
+ ELIBMAX,
+ ELIBEXEC,
+ EILSEQ,
+ ERESTART,
+ ESTRPIPE,
+ EUSERS,
+ ENOTSOCK,
+ EDESTADDRREQ,
+ EMSGSIZE,
+ EPROTOTYPE,
+ ENOPROTOOPT,
+ EPROTONOSUPPORT,
+ ESOCKTNOSUPPORT,
+ EOPNOTSUPP,
+ EPFNOSUPPORT,
+ EAFNOSUPPORT,
+ EADDRINUSE,
+ EADDRNOTAVAIL,
+ ENETDOWN,
+ ENETUNREACH,
+ ENETRESET,
+ ECONNABORTED,
+ ECONNRESET,
+ ENOBUFS,
+ EISCONN,
+ ENOTCONN,
+ ESHUTDOWN,
+ ETOOMANYREFS,
+ ETIMEDOUT,
+ ECONNREFUSED,
+ EHOSTDOWN,
+ EHOSTUNREACH,
+ EALREADY,
+ EINPROGRESS,
+ ESTALE,
+ EUCLEAN,
+ ENOTNAM,
+ ENAVAIL,
+ EISNAM,
+ EREMOTEIO,
+ EDQUOT,
+ ENOMEDIUM,
+ EMEDIUMTYPE,
+ ECANCELED,
+ ENOKEY,
+ EKEYEXPIRED,
+ EKEYREVOKED,
+ EKEYREJECTED,
+ ELAST
+)
+
+var error [ELAST]string;
+
+func init(){
+ error[ENONE] = "No error";
+ error[EPERM] = "Operation not permitted";
+ error[ENOENT] = "No such file or directory";
+ error[ESRCH] = "No such process";
+ error[EINTR] = "Interrupted system call";
+ error[EIO] = "I/O error";
+ error[ENXIO] = "No such device or address";
+ error[E2BIG] = "Argument list too long";
+ error[ENOEXEC] = "Exec format error";
+ error[EBADF] = "Bad file number";
+ error[ECHILD] = "No child processes";
+ error[EAGAIN] = "Try again";
+ error[ENOMEM] = "Out of memory";
+ error[EACCES] = "Permission denied";
+ error[EFAULT] = "Bad address";
+ error[ENOTBLK] = "Block device required";
+ error[EBUSY] = "Device or resource busy";
+ error[EEXIST] = "File exists";
+ error[EXDEV] = "Cross-device link";
+ error[ENODEV] = "No such device";
+ error[ENOTDIR] = "Not a directory";
+ error[EISDIR] = "Is a directory";
+ error[EINVAL] = "Invalid argument";
+ error[ENFILE] = "File table overflow";
+ error[EMFILE] = "Too many open files";
+ error[ENOTTY] = "Not a typewriter";
+ error[ETXTBSY] = "Text file busy";
+ error[EFBIG] = "File too large";
+ error[ENOSPC] = "No space left on device";
+ error[ESPIPE] = "Illegal seek";
+ error[EROFS] = "Read-only file system";
+ error[EMLINK] = "Too many links";
+ error[EPIPE] = "Broken pipe";
+ error[EDOM] = "Math argument out of domain of func";
+ error[ERANGE] = "Math result not representable";
+ error[EDEADLK] = "Resource deadlock would occur";
+ error[ENAMETOOLONG] = "File name too long";
+ error[ENOLCK] = "No record locks available";
+ error[ENOSYS] = "Function not implemented";
+ error[ENOTEMPTY] = "Directory not empty";
+ error[ELOOP] = "Too many symbolic links encountered";
+ error[ENOMSG] = "No message of desired type";
+ error[EIDRM] = "Identifier removed";
+ error[ECHRNG] = "Channel number out of range";
+ error[EL2NSYNC] = "Level 2 not synchronized";
+ error[EL3HLT] = "Level 3 halted";
+ error[EL3RST] = "Level 3 reset";
+ error[ELNRNG] = "Link number out of range";
+ error[EUNATCH] = "Protocol driver not attached";
+ error[ENOCSI] = "No CSI structure available";
+ error[EL2HLT] = "Level 2 halted";
+ error[EBADE] = "Invalid exchange";
+ error[EBADR] = "Invalid request descriptor";
+ error[EXFULL] = "Exchange full";
+ error[ENOANO] = "No anode";
+ error[EBADRQC] = "Invalid request code";
+ error[EBADSLT] = "Invalid slot";
+ error[EBFONT] = "Bad font file format";
+ error[ENOSTR] = "Device not a stream";
+ error[ENODATA] = "No data available";
+ error[ETIME] = "Timer expired";
+ error[ENOSR] = "Out of streams resources";
+ error[ENONET] = "Machine is not on the network";
+ error[ENOPKG] = "Package not installed";
+ error[EREMOTE] = "Object is remote";
+ error[ENOLINK] = "Link has been severed";
+ error[EADV] = "Advertise error";
+ error[ESRMNT] = "Srmount error";
+ error[ECOMM] = "Communication error on send";
+ error[EPROTO] = "Protocol error";
+ error[EMULTIHOP] = "Multihop attempted";
+ error[EDOTDOT] = "RFS specific error";
+ error[EBADMSG] = "Not a data message";
+ error[EOVERFLOW] = "Value too large for defined data type";
+ error[ENOTUNIQ] = "Name not unique on network";
+ error[EBADFD] = "File descriptor in bad state";
+ error[EREMCHG] = "Remote address changed";
+ error[ELIBACC] = "Can not access a needed shared library";
+ error[ELIBBAD] = "Accessing a corrupted shared library";
+ error[ELIBSCN] = ".lib section in a.out corrupted";
+ error[ELIBMAX] = "Attempting to link in too many shared libraries";
+ error[ELIBEXEC] = "Cannot exec a shared library directly";
+ error[EILSEQ] = "Illegal byte sequence";
+ error[ERESTART] = "Interrupted system call should be restarted";
+ error[ESTRPIPE] = "Streams pipe error";
+ error[EUSERS] = "Too many users";
+ error[ENOTSOCK] = "Socket operation on non-socket";
+ error[EDESTADDRREQ] = "Destination address required";
+ error[EMSGSIZE] = "Message too long";
+ error[EPROTOTYPE] = "Protocol wrong type for socket";
+ error[ENOPROTOOPT] = "Protocol not available";
+ error[EPROTONOSUPPORT] = "Protocol not supported";
+ error[ESOCKTNOSUPPORT] = "Socket type not supported";
+ error[EOPNOTSUPP] = "Operation not supported on transport endpoint";
+ error[EPFNOSUPPORT] = "Protocol family not supported";
+ error[EAFNOSUPPORT] = "Address family not supported by protocol";
+ error[EADDRINUSE] = "Address already in use";
+ error[EADDRNOTAVAIL] = "Cannot assign requested address";
+ error[ENETDOWN] = "Network is down";
+ error[ENETUNREACH] = "Network is unreachable";
+ error[ENETRESET] = "Network dropped connection because of reset";
+ error[ECONNABORTED] = "Software caused connection abort";
+ error[ECONNRESET] = "Connection reset by peer";
+ error[ENOBUFS] = "No buffer space available";
+ error[EISCONN] = "Transport endpoint is already connected";
+ error[ENOTCONN] = "Transport endpoint is not connected";
+ error[ESHUTDOWN] = "Cannot send after transport endpoint shutdown";
+ error[ETOOMANYREFS] = "Too many references: cannot splice";
+ error[ETIMEDOUT] = "Connection timed out";
+ error[ECONNREFUSED] = "Connection refused";
+ error[EHOSTDOWN] = "Host is down";
+ error[EHOSTUNREACH] = "No route to host";
+ error[EALREADY] = "Operation already in progress";
+ error[EINPROGRESS] = "Operation now in progress";
+ error[ESTALE] = "Stale NFS file handle";
+ error[EUCLEAN] = "Structure needs cleaning";
+ error[ENOTNAM] = "Not a XENIX named type file";
+ error[ENAVAIL] = "No XENIX semaphores available";
+ error[EISNAM] = "Is a named type file";
+ error[EREMOTEIO] = "Remote I/O error";
+ error[EDQUOT] = "Quota exceeded";
+ error[ENOMEDIUM] = "No medium found";
+ error[EMEDIUMTYPE] = "Wrong medium type";
+ error[ECANCELED] = "Operation Canceled";
+ error[ENOKEY] = "Required key not available";
+ error[EKEYEXPIRED] = "Key has expired";
+ error[EKEYREVOKED] = "Key has been revoked";
+ error[EKEYREJECTED] = "Key was rejected by service";
+}
+
+var digits string = "0123456789"
+
+func str(val int64) string { // do it here rather than with fmt to avoid dependency
+ if val < 0 {
+ return "-" + str(-val);
+ }
+ var buf [32]byte; // big enough for int64
+ i := len(buf)-1;
+ for val >= 10 {
+ buf[i] = digits[val%10];
+ i--;
+ val /= 10;
+ }
+ buf[i] = digits[val];
+ return string(buf)[i:len(buf)];
+}
+
+func errstr(errno int64) string {
+ if errno < 0 || errno >= len(error) {
+ return "Error " + str(errno)
+ }
+ return error[errno]
+}
diff --git a/src/syscall/syscall.go b/src/syscall/syscall.go
new file mode 100644
index 000000000..49d7401ed
--- /dev/null
+++ b/src/syscall/syscall.go
@@ -0,0 +1,15 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+// for simplicity of addressing in assembler, all integers are 64 bits
+// in these calling sequences.
+
+func open(*byte, int64) (ret int64, errno int64);
+func close(int64) (ret int64, errno int64);
+func read(int64, *byte, int64) (ret int64, errno int64);
+func write(int64, *byte, int64) (ret int64, errno int64);
+
+export open, close, read, write
diff --git a/src/syscall/syscall_amd64_darwin.s b/src/syscall/syscall_amd64_darwin.s
new file mode 100644
index 000000000..a87352e8e
--- /dev/null
+++ b/src/syscall/syscall_amd64_darwin.s
@@ -0,0 +1,107 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//
+// System calls for AMD64, Darwin
+//
+
+//TEXT syscall·exit(SB),1,$-8
+// MOVL 8(SP), DI // arg 1 exit status
+// MOVL $(0x2000000+1), AX // syscall entry
+// SYSCALL
+// CALL notok(SB)
+// RET
+
+TEXT syscall·open(SB),1,$-8
+ MOVQ 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVQ $0, R10
+ MOVL $(0x2000000+5), AX // syscall entry
+ SYSCALL
+ JCC 4(PC)
+ MOVQ $-1, 24(SP)
+ MOVQ AX, 32(SP)
+ RET
+ MOVQ AX, 24(SP)
+ MOVQ $0, 32(SP)
+ RET
+
+TEXT syscall·close(SB),1,$-8
+ MOVL 8(SP), DI
+ MOVL $(0x2000000+6), AX // syscall entry
+ SYSCALL
+ JCC 4(PC)
+ MOVQ $-1, 16(SP)
+ MOVQ AX, 24(SP)
+ RET
+ MOVQ AX, 16(SP)
+ MOVQ $0, 24(SP)
+ RET
+
+TEXT syscall·read(SB),1,$-8
+ MOVQ 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVQ 24(SP), DX
+ MOVL $(0x2000000+3), AX // syscall entry
+ SYSCALL
+ JCC 4(PC)
+ MOVQ $-1, 32(SP)
+ MOVQ AX, 40(SP)
+ RET
+ MOVQ AX, 32(SP)
+ MOVQ $0, 40(SP)
+ RET
+
+TEXT syscall·write(SB),1,$-8
+ MOVQ 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVQ 24(SP), DX
+ MOVL $(0x2000000+4), AX // syscall entry
+ SYSCALL
+ JCC 4(PC)
+ MOVQ $-1, 32(SP)
+ MOVQ AX, 40(SP)
+ RET
+ MOVQ AX, 32(SP)
+ MOVQ $0, 40(SP)
+ RET
+
+//TEXT fstat(SB),1,$-8
+// MOVL 8(SP), DI
+// MOVQ 16(SP), SI
+// MOVL $(0x2000000+339), AX // syscall entry; really fstat64
+// SYSCALL
+// RET
+//
+//TEXT syscall·sigaction(SB),1,$-8
+// MOVL 8(SP), DI // arg 1 sig
+// MOVQ 16(SP), SI // arg 2 act
+// MOVQ 24(SP), DX // arg 3 oact
+// MOVQ 24(SP), CX // arg 3 oact
+// MOVQ 24(SP), R10 // arg 3 oact
+// MOVL $(0x2000000+46), AX // syscall entry
+// SYSCALL
+// JCC 2(PC)
+// CALL notok(SB)
+// RET
+//
+//TEXT sigtramp(SB),1,$24
+// MOVL DX,0(SP)
+// MOVQ CX,8(SP)
+// MOVQ R8,16(SP)
+// CALL sighandler(SB)
+// RET
+//
+//TEXT syscall·mmap(SB),1,$-8
+// MOVQ 8(SP), DI // arg 1 addr
+// MOVL 16(SP), SI // arg 2 len
+// MOVL 20(SP), DX // arg 3 prot
+// MOVL 24(SP), R10 // arg 4 flags
+// MOVL 28(SP), R8 // arg 5 fid
+// MOVL 32(SP), R9 // arg 6 offset
+// MOVL $(0x2000000+197), AX // syscall entry
+// SYSCALL
+// JCC 2(PC)
+// CALL notok(SB)
+// RET
diff --git a/src/syscall/syscall_amd64_linux.s b/src/syscall/syscall_amd64_linux.s
new file mode 100644
index 000000000..9690a9636
--- /dev/null
+++ b/src/syscall/syscall_amd64_linux.s
@@ -0,0 +1,123 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//
+// System calls for AMD64, Linux
+//
+
+//TEXT sys·exit(SB),1,$0-8
+// MOVL 8(SP), DI
+// MOVL $60, AX
+// SYSCALL
+// RET
+
+TEXT syscall·open(SB),1,$0-16
+ MOVQ 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVQ $0, DX
+ MOVQ $2, AX // syscall entry
+ SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 5(PC)
+ MOVQ $-1, 24(SP)
+ NEGQ AX
+ MOVQ AX, 32(SP)
+ RET
+ MOVQ AX, 24(SP)
+ MOVQ $0, 32(SP)
+ RET
+
+TEXT syscall·close(SB),1,$0-16
+ MOVQ 8(SP), DI
+ MOVL $3, AX // syscall entry
+ SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 5(PC)
+ MOVQ $-1, 16(SP)
+ NEGQ AX
+ MOVQ AX, 24(SP)
+ RET
+ MOVQ AX, 16(SP)
+ MOVQ $0, 24(SP)
+ RET
+
+//TEXT fstat(SB),1,$0-16
+// MOVL 8(SP), DI
+// MOVQ 16(SP), SI
+// MOVL $5, AX // syscall entry
+// SYSCALL
+// RET
+
+TEXT syscall·read(SB),1,$0-16
+ MOVL 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVL 24(SP), DX
+ MOVL $0, AX // syscall entry
+ SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 5(PC)
+ MOVQ $-1, 32(SP)
+ NEGQ AX
+ MOVQ AX, 40(SP)
+ RET
+ MOVQ AX, 32(SP)
+ MOVQ $0, 40(SP)
+ RET
+
+TEXT syscall·write(SB),1,$0-16
+ MOVL 8(SP), DI
+ MOVQ 16(SP), SI
+ MOVL 24(SP), DX
+ MOVL $1, AX // syscall entry
+ SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 5(PC)
+ MOVQ $-1, 32(SP)
+ NEGQ AX
+ MOVQ AX, 40(SP)
+ RET
+ MOVQ AX, 32(SP)
+ MOVQ $0, 40(SP)
+ RET
+
+//TEXT sys·rt_sigaction(SB),1,$0-32
+// MOVL 8(SP), DI
+// MOVQ 16(SP), SI
+// MOVQ 24(SP), DX
+// MOVQ 32(SP), CX
+// MOVL CX, R10
+// MOVL $13, AX // syscall entry
+// SYSCALL
+// RET
+//
+//TEXT sigtramp(SB),1,$24-16
+// MOVQ DI,0(SP)
+// MOVQ SI,8(SP)
+// MOVQ DX,16(SP)
+// CALL sighandler(SB)
+// RET
+//
+//TEXT sys·mmap(SB),1,$0-32
+// MOVQ 8(SP), DI
+// MOVL 16(SP), SI
+// MOVL 20(SP), DX
+// MOVL 24(SP), CX
+// MOVL 28(SP), R8
+// MOVL 32(SP), R9
+//
+///* flags arg for ANON is 1000 but sb 20 */
+// MOVL CX, AX
+// ANDL $~0x1000, CX
+// ANDL $0x1000, AX
+// SHRL $7, AX
+// ORL AX, CX
+//
+// MOVL CX, R10
+// MOVL $9, AX // syscall entry
+// SYSCALL
+// CMPQ AX, $0xfffffffffffff001
+// JLS 2(PC)
+// CALL notok(SB)
+// RET
+//