| // Copyright 2025 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. |
| |
| //go:build valgrind && linux |
| |
| #include "textflag.h" |
| |
| // Instead of using cgo and using the Valgrind macros, we just emit the special client request |
| // assembly ourselves. The client request mechanism is basically the same across all architectures, |
| // with the notable difference being the special preamble that lets Valgrind know we want to do |
| // a client request. |
| // |
| // The form of the VALGRIND_DO_CLIENT_REQUEST macro assembly can be found in the valgrind/valgrind.h |
| // header file [0]. |
| // |
| // [0] https://sourceware.org/git/?p=valgrind.git;a=blob;f=include/valgrind.h.in;h=f1710924aa7372e7b7e2abfbf7366a2286e33d2d;hb=HEAD |
| |
| // func valgrindClientRequest(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (ret uintptr) |
| TEXT runtime·valgrindClientRequest(SB), NOSPLIT, $0-56 |
| // Load the address of the first of the (contiguous) arguments into AX. |
| LEAQ args+0(FP), AX |
| |
| // Zero DX, since some requests may not populate it. |
| XORL DX, DX |
| |
| // Emit the special preabmle. |
| ROLQ $3, DI; ROLQ $13, DI |
| ROLQ $61, DI; ROLQ $51, DI |
| |
| // "Execute" the client request. |
| XCHGQ BX, BX |
| |
| // Copy the result out of DX. |
| MOVQ DX, ret+48(FP) |
| |
| RET |