| // Copyright 2015 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. | |
| // +build msan | |
| package runtime | |
| import ( | |
| "unsafe" | |
| ) | |
| // Public memory sanitizer API. | |
| func MSanRead(addr unsafe.Pointer, len int) { | |
| msanread(addr, uintptr(len)) | |
| } | |
| func MSanWrite(addr unsafe.Pointer, len int) { | |
| msanwrite(addr, uintptr(len)) | |
| } | |
| // Private interface for the runtime. | |
| const msanenabled = true | |
| // If we are running on the system stack, the C program may have | |
| // marked part of that stack as uninitialized. We don't instrument | |
| // the runtime, but operations like a slice copy can call msanread | |
| // anyhow for values on the stack. Just ignore msanread when running | |
| // on the system stack. The other msan functions are fine. | |
| // | |
| //go:nosplit | |
| func msanread(addr unsafe.Pointer, sz uintptr) { | |
| g := getg() | |
| if g == nil || g.m == nil || g == g.m.g0 || g == g.m.gsignal { | |
| return | |
| } | |
| domsanread(addr, sz) | |
| } | |
| //go:noescape | |
| func domsanread(addr unsafe.Pointer, sz uintptr) | |
| //go:noescape | |
| func msanwrite(addr unsafe.Pointer, sz uintptr) | |
| //go:noescape | |
| func msanmalloc(addr unsafe.Pointer, sz uintptr) | |
| //go:noescape | |
| func msanfree(addr unsafe.Pointer, sz uintptr) | |
| // These are called from msan_amd64.s | |
| //go:cgo_import_static __msan_read_go | |
| //go:cgo_import_static __msan_write_go | |
| //go:cgo_import_static __msan_malloc_go | |
| //go:cgo_import_static __msan_free_go |