Commit 5cf4e442 authored by Alex Brainman's avatar Alex Brainman Committed by Emmanuel Odeke

runtime: fix syscall.NewCallback to return all bits for uintptr values

syscall.NewCallback mistakenly used MOVL even for windows/amd64,
which only returned the lower 32 bits regardless of the architecture.
This was due to a copy and paste after porting from windows/386.
The code now uses MOVQ, which will return all the available bits.

Also adjust TestReturnAfterStackGrowInCallback to ensure we never
regress.

Fixes #29331

Change-Id: I4f5c8021c33f234c2bb7baa9ef7a6b4870172509
Reviewed-on: https://go-review.googlesource.com/c/159579
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarEmmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent c97e5765
...@@ -351,7 +351,7 @@ TEXT runtime·callbackasm1(SB),NOSPLIT,$0 ...@@ -351,7 +351,7 @@ TEXT runtime·callbackasm1(SB),NOSPLIT,$0
ADDQ $64, SP ADDQ $64, SP
POPFQ POPFQ
MOVL -8(CX)(DX*1), AX // return value MOVQ -8(CX)(DX*1), AX // return value
POPQ -8(CX)(DX*1) // restore bytes just after the args POPQ -8(CX)(DX*1) // restore bytes just after the args
RET RET
......
...@@ -655,12 +655,16 @@ uintptr_t cfunc(callback f, uintptr_t n) { ...@@ -655,12 +655,16 @@ uintptr_t cfunc(callback f, uintptr_t n) {
r uintptr r uintptr
err syscall.Errno err syscall.Errno
} }
want := result{
// Make it large enough to test issue #29331.
r: (^uintptr(0)) >> 24,
err: 333,
}
c := make(chan result) c := make(chan result)
go func() { go func() {
r, _, err := proc.Call(cb, 100) r, _, err := proc.Call(cb, want.r)
c <- result{r, err.(syscall.Errno)} c <- result{r, err.(syscall.Errno)}
}() }()
want := result{r: 100, err: 333}
if got := <-c; got != want { if got := <-c; got != want {
t.Errorf("got %d want %d", got, want) t.Errorf("got %d want %d", got, want)
} }
......
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