1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build msan
6
7package runtime
8
9import (
10	"unsafe"
11)
12
13// Public memory sanitizer API.
14
15func MSanRead(addr unsafe.Pointer, len int) {
16	msanread(addr, uintptr(len))
17}
18
19func MSanWrite(addr unsafe.Pointer, len int) {
20	msanwrite(addr, uintptr(len))
21}
22
23// Private interface for the runtime.
24const msanenabled = true
25
26// If we are running on the system stack, the C program may have
27// marked part of that stack as uninitialized. We don't instrument
28// the runtime, but operations like a slice copy can call msanread
29// anyhow for values on the stack. Just ignore msanread when running
30// on the system stack. The other msan functions are fine.
31//
32//go:nosplit
33func msanread(addr unsafe.Pointer, sz uintptr) {
34	g := getg()
35	if g == nil || g.m == nil || g == g.m.g0 || g == g.m.gsignal {
36		return
37	}
38	domsanread(addr, sz)
39}
40
41//go:noescape
42func domsanread(addr unsafe.Pointer, sz uintptr)
43
44//go:noescape
45func msanwrite(addr unsafe.Pointer, sz uintptr)
46
47//go:noescape
48func msanmalloc(addr unsafe.Pointer, sz uintptr)
49
50//go:noescape
51func msanfree(addr unsafe.Pointer, sz uintptr)
52
53// These are called from msan_amd64.s
54//go:cgo_import_static __msan_read_go
55//go:cgo_import_static __msan_write_go
56//go:cgo_import_static __msan_malloc_go
57//go:cgo_import_static __msan_free_go
58