Commit c557836c authored by Rob Pike's avatar Rob Pike

- mark syscall support routines as non-stack-generating

- add unlink, creat
- add constants for open
- fix some comments

R=gri
OCL=13654
CL=13656
parent 6acdf3ed
...@@ -4,16 +4,17 @@ ...@@ -4,16 +4,17 @@
package syscall package syscall
// File operations for Darwin
import syscall "syscall" import syscall "syscall"
export Stat export Stat
export stat, fstat, lstat 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 StatToInt(s *Stat) int64;
// Stat and relatives for Darwin
type dev_t uint32; type dev_t uint32;
type ino_t uint64; type ino_t uint64;
type mode_t uint16; type mode_t uint16;
...@@ -50,9 +51,43 @@ type Stat struct { ...@@ -50,9 +51,43 @@ type Stat struct {
st_qspare[2] int64; 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; 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; return r1, err;
} }
...@@ -82,7 +117,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) { ...@@ -82,7 +117,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
} }
fds[0] = r1; fds[0] = r1;
fds[1] = r2; fds[1] = r2;
return 0, err; return 0, 0;
} }
func stat(name *byte, buf *Stat) (ret int64, errno int64) { func stat(name *byte, buf *Stat) (ret int64, errno int64) {
...@@ -102,3 +137,9 @@ func fstat(fd int64, 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); r1, r2, err := syscall.Syscall(SYSFSTAT, fd, StatToInt(buf), 0);
return r1, err; 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;
}
...@@ -4,17 +4,18 @@ ...@@ -4,17 +4,18 @@
package syscall package syscall
// File operations for Linux
import syscall "syscall" import syscall "syscall"
export Stat export Stat
export stat, fstat, lstat 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 StatToInt(s *Stat) int64;
func Addr32ToInt(s *int32) int64; func Addr32ToInt(s *int32) int64;
// Stat and relatives for Linux
type dev_t uint64; type dev_t uint64;
type ino_t uint64; type ino_t uint64;
type mode_t uint32; type mode_t uint32;
...@@ -51,9 +52,43 @@ type Stat struct { ...@@ -51,9 +52,43 @@ type Stat struct {
st_unused6 int64; 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; 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; return r1, err;
} }
...@@ -64,7 +99,6 @@ func close(fd int64) (ret int64, errno int64) { ...@@ -64,7 +99,6 @@ func close(fd int64) (ret int64, errno int64) {
} }
func read(fd int64, buf *byte, nbytes 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; const SYSREAD = 0;
r1, r2, err := syscall.Syscall(SYSREAD, fd, AddrToInt(buf), nbytes); r1, r2, err := syscall.Syscall(SYSREAD, fd, AddrToInt(buf), nbytes);
return r1, err; return r1, err;
...@@ -85,7 +119,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) { ...@@ -85,7 +119,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
} }
fds[0] = int64(t[0]); fds[0] = int64(t[0]);
fds[1] = int64(t[1]); fds[1] = int64(t[1]);
return 0, err; return 0, 0;
} }
func stat(name *byte, buf *Stat) (ret int64, errno int64) { func stat(name *byte, buf *Stat) (ret int64, errno int64) {
...@@ -106,3 +140,8 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) { ...@@ -106,3 +140,8 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
return r1, err; 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;
}
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
// Trap # in AX, args in DI SI DX, return in AX DX // 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 16(SP), DI
MOVQ 24(SP), SI MOVQ 24(SP), SI
MOVQ 32(SP), DX MOVQ 32(SP), DX
...@@ -26,12 +26,13 @@ TEXT syscall·Syscall(SB),1,$-8 ...@@ -26,12 +26,13 @@ TEXT syscall·Syscall(SB),1,$-8
MOVQ $0, 56(SP) // errno MOVQ $0, 56(SP) // errno
RET RET
TEXT syscall·AddrToInt(SB),1,$-8 // conversion operators - really just casts
TEXT syscall·AddrToInt(SB),7,$-8
MOVQ 8(SP), AX MOVQ 8(SP), AX
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
RET RET
TEXT syscall·StatToInt(SB),1,$-8 TEXT syscall·StatToInt(SB),7,$-8
MOVQ 8(SP), AX MOVQ 8(SP), AX
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
RET RET
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
// Trap # in AX, args in DI SI DX, return in AX DX // 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 16(SP), DI
MOVQ 24(SP), SI MOVQ 24(SP), SI
MOVQ 32(SP), DX MOVQ 32(SP), DX
...@@ -27,17 +27,18 @@ TEXT syscall·Syscall(SB),1,$-8 ...@@ -27,17 +27,18 @@ TEXT syscall·Syscall(SB),1,$-8
MOVQ $0, 56(SP) // errno MOVQ $0, 56(SP) // errno
RET RET
TEXT syscall·AddrToInt(SB),1,$-8 // conversion operators - really just casts
TEXT syscall·AddrToInt(SB),7,$-8
MOVQ 8(SP), AX MOVQ 8(SP), AX
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
RET RET
TEXT syscall·Addr32ToInt(SB),1,$-8 TEXT syscall·Addr32ToInt(SB),7,$-8
MOVQ 8(SP), AX MOVQ 8(SP), AX
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
RET RET
TEXT syscall·StatToInt(SB),1,$-8 TEXT syscall·StatToInt(SB),7,$-8
MOVQ 8(SP), AX MOVQ 8(SP), AX
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
RET 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