# tests.
# If files are named on the command line, use them instead of test*.go.
-O=6
+case "$GOARCH" in
+amd64) O=6;;
+arm) O=5;;
+386) O=8;;
+*) echo 'unknown $GOARCH' 1>&2
+esac
+
GC=${GC:-${O}g}
GL=${GL:-${O}l}
export GC GL
exit 1
esac
-ofiles=$(echo $gofiles | sed 's/\.go/.6/g')
+ofiles=$(echo $gofiles | sed 's/\.go/.'$O'/g')
files=$(echo $gofiles | sed 's/\.go//g')
done
# They all compile; now generate the code to call them.
-trap "rm -f _testmain.go _testmain.6" 0 1 2 3 14 15
+trap "rm -f _testmain.go _testmain.$O" 0 1 2 3 14 15
{
# package spec
echo 'package main'
--- /dev/null
+// 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.
+
+// func cas(val *int32, old, new int32) bool
+// Atomically:
+// if *val == old {
+// *val = new;
+// return true;
+// }else
+// return false;
+TEXT sync·cas(SB), 7, $0
+ MOVL 4(SP), BX
+ MOVL 8(SP), AX
+ MOVL 12(SP), CX
+ LOCK
+ CMPXCHGL CX, 0(BX)
+ JZ ok
+ MOVL $0, 16(SP)
+ RET
+ok:
+ MOVL $1, 16(SP)
+ RET
O2=\
errstr.$O\
- syscall_$(GOOS)_$(GOARCH).$O\
+ zsyscall_$(GOOS)_$(GOARCH).$O\
O3=\
- zsyscall_$(GOOS)_$(GOARCH).$O\
+ syscall_$(GOOS)_$(GOARCH).$O\
O4=\
syscall_$(GOOS).$O\
rm -f $(O1)
a2: $(O2)
- $(AR) grc _obj$D/syscall.a errstr.$O syscall_$(GOOS)_$(GOARCH).$O
+ $(AR) grc _obj$D/syscall.a errstr.$O zsyscall_$(GOOS)_$(GOARCH).$O
rm -f $(O2)
a3: $(O3)
- $(AR) grc _obj$D/syscall.a zsyscall_$(GOOS)_$(GOARCH).$O
+ $(AR) grc _obj$D/syscall.a syscall_$(GOOS)_$(GOARCH).$O
rm -f $(O3)
a4: $(O4)
--- /dev/null
+// 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 call support for 386, Darwin
+//
+
+// func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
+// func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
+// Trap # in AX, args on stack above caller pc.
+
+TEXT syscall·Syscall(SB),7,$0
+ CALL sys·entersyscall(SB)
+ MOVL 4(SP), AX // syscall entry
+ // slide args down on top of system call number
+ LEAL 8(SP), SI
+ LEAL 4(SP), DI
+ CLD
+ MOVSL
+ MOVSL
+ MOVSL
+ INT $0x80
+ JAE ok
+ MOVL $-1, 20(SP) // r1
+ MOVL $-1, 24(SP) // r2
+ MOVL AX, 28(SP) // errno
+ CALL sys·exitsyscall(SB)
+ RET
+ok:
+ MOVL AX, 20(SP) // r1
+ MOVL DX, 24(SP) // r2 ???
+ MOVL $0, 28(SP) // errno
+ CALL sys·exitsyscall(SB)
+ RET
+
+TEXT syscall·Syscall6(SB),7,$0
+ CALL sys·entersyscall(SB)
+ MOVL 4(SP), AX // syscall entry
+ // slide args down on top of system call number
+ LEAL 8(SP), SI
+ LEAL 4(SP), DI
+ CLD
+ MOVSL
+ MOVSL
+ MOVSL
+ MOVSL
+ MOVSL
+ MOVSL
+ INT $0x80
+ JAE ok
+ MOVL $-1, 32(SP) // r1
+ MOVL $-1, 36(SP) // r2
+ MOVL AX, 40(SP) // errno
+ CALL sys·exitsyscall(SB)
+ RET
+ok6:
+ MOVL AX, 32(SP) // r1
+ MOVL DX, 36(SP) // r2 ???
+ MOVL $0, 40(SP) // errno
+ CALL sys·exitsyscall(SB)
+ RET
+
+TEXT syscall·RawSyscall(SB),7,$0
+ MOVL 4(SP), AX // syscall entry
+ // slide args down on top of system call number
+ LEAL 8(SP), SI
+ LEAL 4(SP), DI
+ CLD
+ MOVSL
+ MOVSL
+ MOVSL
+ INT $0x80
+ JAE ok1
+ MOVL $-1, 20(SP) // r1
+ MOVL $-1, 24(SP) // r2
+ MOVL AX, 28(SP) // errno
+ RET
+ok1:
+ MOVL AX, 20(SP) // r1
+ MOVL DX, 24(SP) // r2 ???
+ MOVL $0, 28(SP) // errno
+ RET
--- /dev/null
+// 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
+
+import "syscall"
+
+func TimespecToNsec(ts Timespec) int64 {
+ return int64(ts.Sec)*1e9 + int64(ts.Nsec);
+}
+
+func NsecToTimespec(nsec int64) (ts Timespec) {
+ ts.Sec = int32(nsec / 1e9);
+ ts.Nsec = int32(nsec % 1e9);
+ return;
+}
+
+func TimevalToNsec(tv Timeval) int64 {
+ return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3;
+}
+
+func NsecToTimeval(nsec int64) (tv Timeval) {
+ nsec += 999; // round up to microsecond
+ tv.Usec = int32(nsec%1e9 / 1e3);
+ tv.Sec = int32(nsec/1e9);
+ return;
+}
+
+//sys gettimeofday(tp *Timeval) (sec int64, usec int32, errno int)
+func Gettimeofday(tv *Timeval) (errno int) {
+ // The tv passed to gettimeofday must be non-nil
+ // but is otherwise unused. The answers come back
+ // in the two registers.
+ sec, usec, err := gettimeofday(tv);
+ tv.Sec = int32(sec);
+ tv.Usec = int32(usec);
+ return err;
+}
+
tv.Sec = int64(nsec/1e9);
return;
}
+
+//sys gettimeofday(tp *Timeval) (sec int64, usec int32, errno int)
+func Gettimeofday(tv *Timeval) (errno int) {
+ // The tv passed to gettimeofday must be non-nil
+ // but is otherwise unused. The answers come back
+ // in the two registers.
+ sec, usec, err := gettimeofday(tv);
+ tv.Sec = sec;
+ tv.Usec = usec;
+ return err;
+}
+
--- /dev/null
+// 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.
+
+// Nothing to see here.
else
gcpercent = atoi(p);
}
- if(gcpercent < 0)
+ if(gcpercent < 0 || sizeof(void*) == 4) // TODO(rsc): broken on 32-bit right now
return;
semacquire(&gcsema);