Commit 20a02661 authored by Rob Pike's avatar Rob Pike

beginnings of a low-level syscall library

R=ken
OCL=13483
CL=13496
parent 12082728
......@@ -663,7 +663,7 @@ scanpkg(Biobuf *b, long size)
continue;
goto foundstart;
}
fprint(2, "ar: no package import section in %s\n", file);
fprint(2, "ar: warning: no package import section in %s\n", file);
return;
foundstart:
......
# 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) $<
// 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]
}
// 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]
}
// 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
// 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
// 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
//
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment