|  | // 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. | 
|  | func msanread(addr unsafe.Pointer, sz uintptr) { | 
|  | g := getg() | 
|  | if 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 |