]> Cypherpunks repositories - gostls13.git/commitdiff
- mark syscall support routines as non-stack-generating
authorRob Pike <r@golang.org>
Wed, 30 Jul 2008 21:23:53 +0000 (14:23 -0700)
committerRob Pike <r@golang.org>
Wed, 30 Jul 2008 21:23:53 +0000 (14:23 -0700)
- add unlink, creat
- add constants for open
- fix some comments

R=gri
OCL=13654
CL=13656

src/syscall/file_amd64_darwin.go
src/syscall/file_amd64_linux.go
src/syscall/syscall_amd64_darwin.s
src/syscall/syscall_amd64_linux.s

index df2a1f81f935519e767f1b9ab0a8dded2675e0fd..97017e5d31f033dd9c1637aa3a26b6f7cd24605c 100644 (file)
@@ -4,16 +4,17 @@
 
 package syscall
 
+// File operations for Darwin
+
 import syscall "syscall"
 
 export Stat
 export stat, fstat, lstat
-export open, close, read, write, pipe
+export open, creat, close, read, write, pipe
+export unlink
 
 func   StatToInt(s *Stat) int64;
 
-// Stat and relatives for Darwin
-
 type dev_t uint32;
 type ino_t uint64;
 type mode_t uint16;
@@ -50,9 +51,43 @@ type Stat struct {
        st_qspare[2]    int64;
 }
 
-func open(name *byte, mode int64) (ret int64, errno int64) {
+const (
+       O_RDONLY = 0x0;
+       O_WRONLY = 0x1;
+       O_RDWR = 0x2;
+       O_APPEND = 0x8;
+       O_ASYNC = 0x40;
+       O_CREAT = 0x200;
+       O_NOCTTY = 0x20000;
+       O_NONBLOCK = 0x4;
+       O_NDELAY = O_NONBLOCK;
+       O_SYNC = 0x80;
+       O_TRUNC = 0x400;
+)
+
+export (
+       O_RDONLY,
+       O_WRONLY,
+       O_RDWR,
+       O_APPEND,
+       O_ASYNC,
+       O_CREAT,
+       O_NOCTTY,
+       O_NONBLOCK,
+       O_NDELAY,
+       O_SYNC,
+       O_TRUNC
+)
+
+func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
        const SYSOPEN = 5;
-       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, 0);
+       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+       return r1, err;
+}
+
+func creat(name *byte, mode int64) (ret int64, errno int64) {
+       const SYSOPEN = 5;
+       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
        return r1, err;
 }
 
@@ -82,7 +117,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
        }
        fds[0] = r1;
        fds[1] = r2;
-       return 0, err;
+       return 0, 0;
 }
 
 func stat(name *byte, buf *Stat) (ret int64, errno int64) {
@@ -102,3 +137,9 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
        r1, r2, err := syscall.Syscall(SYSFSTAT, fd, StatToInt(buf), 0);
        return r1, err;
 }
+
+func unlink(name *byte) (ret int64, errno int64) {
+       const SYSUNLINK = 10;
+       r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+       return r1, err;
+}
index e407a17fec80d247463031782e83b8f5aaebe26c..dc600b8c3f304e84073c6485974f1d80c51aabb8 100644 (file)
@@ -4,17 +4,18 @@
 
 package syscall
 
+// File operations for Linux
+
 import syscall "syscall"
 
 export Stat
 export stat, fstat, lstat
-export open, close, read, write, pipe
+export open, creat, close, read, write, pipe
+export unlink
 
 func   StatToInt(s *Stat) int64;
 func   Addr32ToInt(s *int32) int64;
 
-// Stat and relatives for Linux
-
 type dev_t uint64;
 type ino_t uint64;
 type mode_t uint32;
@@ -51,9 +52,43 @@ type Stat struct {
        st_unused6      int64;
 }
 
-func open(name *byte, mode int64) (ret int64, errno int64) {
+const (
+       O_RDONLY = 0x0;
+       O_WRONLY = 0x1;
+       O_RDWR = 0x2;
+       O_APPEND = 0x400;
+       O_ASYNC = 0x2000;
+       O_CREAT = 0x40;
+       O_NOCTTY = 0x100;
+       O_NONBLOCK = 0x800;
+       O_NDELAY = O_NONBLOCK;
+       O_SYNC = 0x1000;
+       O_TRUNC = 0x200;
+)
+
+export (
+       O_RDONLY,
+       O_WRONLY,
+       O_RDWR,
+       O_APPEND,
+       O_ASYNC,
+       O_CREAT,
+       O_NOCTTY,
+       O_NONBLOCK,
+       O_NDELAY,
+       O_SYNC,
+       O_TRUNC
+)
+
+func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
+       const SYSOPEN = 2;
+       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+       return r1, err;
+}
+
+func creat(name *byte, mode int64) (ret int64, errno int64) {
        const SYSOPEN = 2;
-       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, 0);
+       r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
        return r1, err;
 }
 
@@ -64,7 +99,6 @@ func close(fd int64) (ret int64, errno int64) {
 }
 
 func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
-print "READ: ", fd, " ", nbytes, "\n";
        const SYSREAD = 0;
        r1, r2, err := syscall.Syscall(SYSREAD, fd, AddrToInt(buf), nbytes);
        return r1, err;
@@ -85,7 +119,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
        }
        fds[0] = int64(t[0]);
        fds[1] = int64(t[1]);
-       return 0, err;
+       return 0, 0;
 }
 
 func stat(name *byte, buf *Stat) (ret int64, errno int64) {
@@ -106,3 +140,8 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
        return r1, err;
 }
 
+func unlink(name *byte) (ret int64, errno int64) {
+       const SYSUNLINK = 87;
+       r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+       return r1, err;
+}
index 2d8cd075eb27c3178c76a3f5ad662cbd7b31ac10..5631803e2617082f4d78e144418be5369d60b571 100644 (file)
@@ -9,7 +9,7 @@
 // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
 // Trap # in AX, args in DI SI DX, return in AX DX
 
-TEXT   syscall·Syscall(SB),1,$-8
+TEXT   syscall·Syscall(SB),7,$-8
        MOVQ    16(SP), DI
        MOVQ    24(SP), SI
        MOVQ    32(SP), DX
@@ -26,12 +26,13 @@ TEXT        syscall·Syscall(SB),1,$-8
        MOVQ    $0, 56(SP)      // errno
        RET
 
-TEXT   syscall·AddrToInt(SB),1,$-8
+// conversion operators - really just casts
+TEXT   syscall·AddrToInt(SB),7,$-8
        MOVQ    8(SP), AX
        MOVQ    AX, 16(SP)
        RET
 
-TEXT   syscall·StatToInt(SB),1,$-8
+TEXT   syscall·StatToInt(SB),7,$-8
        MOVQ    8(SP), AX
        MOVQ    AX, 16(SP)
        RET
index b50fc0c13966e19f55c054b7a747b7d925d0b931..c6ce48cd0e47f2aa48fa36f4422dee7ae345778e 100644 (file)
@@ -9,7 +9,7 @@
 // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
 // Trap # in AX, args in DI SI DX, return in AX DX
 
-TEXT   syscall·Syscall(SB),1,$-8
+TEXT   syscall·Syscall(SB),7,$-8
        MOVQ    16(SP), DI
        MOVQ    24(SP), SI
        MOVQ    32(SP), DX
@@ -27,17 +27,18 @@ TEXT        syscall·Syscall(SB),1,$-8
        MOVQ    $0, 56(SP)      // errno
        RET
 
-TEXT   syscall·AddrToInt(SB),1,$-8
+// conversion operators - really just casts
+TEXT   syscall·AddrToInt(SB),7,$-8
        MOVQ    8(SP), AX
        MOVQ    AX, 16(SP)
        RET
 
-TEXT   syscall·Addr32ToInt(SB),1,$-8
+TEXT   syscall·Addr32ToInt(SB),7,$-8
        MOVQ    8(SP), AX
        MOVQ    AX, 16(SP)
        RET
 
-TEXT   syscall·StatToInt(SB),1,$-8
+TEXT   syscall·StatToInt(SB),7,$-8
        MOVQ    8(SP), AX
        MOVQ    AX, 16(SP)
        RET