1// Copyright 2021 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//go:build asan
6
7#include "go_asm.h"
8#include "textflag.h"
9
10#define RARG0 R0
11#define RARG1 R1
12#define FARG R3
13
14// Called from instrumented code.
15// func runtime·asanread(addr unsafe.Pointer, sz uintptr)
16TEXT	runtime·asanread(SB), NOSPLIT, $0-16
17	MOVD	addr+0(FP), RARG0
18	MOVD	size+8(FP), RARG1
19	// void __asan_read_go(void *addr, uintptr_t sz);
20	MOVD	$__asan_read_go(SB), FARG
21	JMP	asancall<>(SB)
22
23// func runtime·asanwrite(addr unsafe.Pointer, sz uintptr)
24TEXT	runtime·asanwrite(SB), NOSPLIT, $0-16
25	MOVD	addr+0(FP), RARG0
26	MOVD	size+8(FP), RARG1
27	// void __asan_write_go(void *addr, uintptr_t sz);
28	MOVD	$__asan_write_go(SB), FARG
29	JMP	asancall<>(SB)
30
31// func runtime·asanunpoison(addr unsafe.Pointer, sz uintptr)
32TEXT	runtime·asanunpoison(SB), NOSPLIT, $0-16
33	MOVD	addr+0(FP), RARG0
34	MOVD	size+8(FP), RARG1
35	// void __asan_unpoison_go(void *addr, uintptr_t sz);
36	MOVD	$__asan_unpoison_go(SB), FARG
37	JMP	asancall<>(SB)
38
39// func runtime·asanpoison(addr unsafe.Pointer, sz uintptr)
40TEXT	runtime·asanpoison(SB), NOSPLIT, $0-16
41	MOVD	addr+0(FP), RARG0
42	MOVD	size+8(FP), RARG1
43	// void __asan_poison_go(void *addr, uintptr_t sz);
44	MOVD	$__asan_poison_go(SB), FARG
45	JMP	asancall<>(SB)
46
47// Switches SP to g0 stack and calls (FARG). Arguments already set.
48TEXT	asancall<>(SB), NOSPLIT, $0-0
49	MOVD	RSP, R19                  // callee-saved
50	CBZ	g, g0stack                // no g, still on a system stack
51	MOVD	g_m(g), R10
52	MOVD	m_g0(R10), R11
53	CMP	R11, g
54	BEQ	g0stack
55
56	MOVD	(g_sched+gobuf_sp)(R11), R4
57	MOVD	R4, RSP
58
59g0stack:
60	BL	(FARG)
61	MOVD	R19, RSP
62	RET
63