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