From 2df5cdbadf5fbcb23f017c9f00b75dc341a69adf Mon Sep 17 00:00:00 2001 From: Jerrin Shaji George Date: Mon, 7 Oct 2019 12:27:33 -0700 Subject: [PATCH] runtime: make nanotime use monotonic clock in Solaris MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nanotime() currently uses the REALTIME clock to get the elapsed time in Solaris. This commit changes it to use the MONOTONIC clock instead, similar to how it's done in Linux and other OSs. Also changed nanotime() and walltime() to call clock_gettime() library function directly from Go code rather than from assembly. Fixes #33674 Change-Id: Ie4a687b17d2140998ecd97af6ce048c86cf5fc02 Reviewed-on: https://go-review.googlesource.com/c/go/+/199502 Run-TryBot: Ian Lance Taylor Reviewed-by: Aram Hăvărneanu --- src/runtime/os3_solaris.go | 15 +++++++++++-- src/runtime/sys_solaris_amd64.s | 40 --------------------------------- src/runtime/timestub2.go | 1 + 3 files changed, 14 insertions(+), 42 deletions(-) diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index afda44295b2..cdec190de52 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -393,11 +393,16 @@ func munmap(addr unsafe.Pointer, n uintptr) { sysvicall2(&libc_munmap, uintptr(addr), uintptr(n)) } -func nanotime2() +const ( + _CLOCK_REALTIME = 3 + _CLOCK_MONOTONIC = 4 +) //go:nosplit func nanotime1() int64 { - return int64(sysvicall0((*libcFunc)(unsafe.Pointer(funcPC(nanotime2))))) + var ts mts + sysvicall2(&libc_clock_gettime, _CLOCK_MONOTONIC, uintptr(unsafe.Pointer(&ts))) + return ts.tv_sec*1e9 + ts.tv_nsec } //go:nosplit @@ -498,6 +503,12 @@ func usleep(µs uint32) { usleep1(µs) } +func walltime1() (sec int64, nsec int32) { + var ts mts + sysvicall2(&libc_clock_gettime, _CLOCK_REALTIME, uintptr(unsafe.Pointer(&ts))) + return ts.tv_sec, int32(ts.tv_nsec) +} + //go:nosplit func write1(fd uintptr, buf unsafe.Pointer, nbyte int32) int32 { return int32(sysvicall3(&libc_write, uintptr(fd), uintptr(buf), uintptr(nbyte))) diff --git a/src/runtime/sys_solaris_amd64.s b/src/runtime/sys_solaris_amd64.s index bd5f7736adc..05fd187517e 100644 --- a/src/runtime/sys_solaris_amd64.s +++ b/src/runtime/sys_solaris_amd64.s @@ -29,26 +29,6 @@ TEXT runtime·miniterrno(SB),NOSPLIT,$0 MOVQ AX, (m_mOS+mOS_perrno)(BX) RET -// int64 runtime·nanotime2(void); -// -// clock_gettime(3c) wrapper because Timespec is too large for -// runtime·nanotime stack. -// -// Called using runtime·sysvicall6 from os_solaris.c:/nanotime. -// NOT USING GO CALLING CONVENTION. -TEXT runtime·nanotime2(SB),NOSPLIT,$0 - // need space for the timespec argument. - SUBQ $64, SP // 16 bytes will do, but who knows in the future? - MOVQ $3, DI // CLOCK_REALTIME from - MOVQ SP, SI - LEAQ libc_clock_gettime(SB), AX - CALL AX - MOVQ (SP), AX // tv_sec from struct timespec - IMULQ $1000000000, AX // multiply into nanoseconds - ADDQ 8(SP), AX // tv_nsec, offset should be stable. - ADDQ $64, SP - RET - // pipe(3c) wrapper that returns fds in AX, DX. // NOT USING GO CALLING CONVENTION. TEXT runtime·pipe1(SB),NOSPLIT,$0 @@ -338,23 +318,3 @@ TEXT runtime·osyield1(SB),NOSPLIT,$0 LEAQ libc_sched_yield(SB), AX CALL AX RET - -// func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB),NOSPLIT,$8-12 - CALL runtime·nanotime1(SB) - MOVQ 0(SP), AX - - // generated code for - // func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 } - // adapted to reduce duplication - MOVQ AX, CX - MOVQ $1360296554856532783, AX - MULQ CX - ADDQ CX, DX - RCRQ $1, DX - SHRQ $29, DX - MOVQ DX, sec+0(FP) - IMULQ $1000000000, DX - SUBQ DX, CX - MOVL CX, nsec+8(FP) - RET diff --git a/src/runtime/timestub2.go b/src/runtime/timestub2.go index 95ec99e7dcc..6d73aabc350 100644 --- a/src/runtime/timestub2.go +++ b/src/runtime/timestub2.go @@ -6,6 +6,7 @@ // +build !windows // +build !freebsd // +build !aix +// +build !solaris package runtime