]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add address sanitizer support for riscv64
authorMeng Zhuo <mzh@golangcn.org>
Tue, 4 Jan 2022 12:53:23 +0000 (20:53 +0800)
committerZhuo Meng <mzh@golangcn.org>
Mon, 16 May 2022 06:55:54 +0000 (06:55 +0000)
Updates #44853

Change-Id: I3ba6ec0cfc6c7f311b586deedb1cda0f87a637aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/375256
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Joel Sing <joel@sing.id.au>
Run-TryBot: Zhuo Meng <mzh@golangcn.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: David Chase <drchase@google.com>
misc/cgo/testsanitizers/cc_test.go
src/cmd/internal/sys/supported.go
src/runtime/asan/asan.go
src/runtime/asan_riscv64.s [new file with mode: 0644]

index 31850e2441783b1012a03f0767bc9f54cc6457ce..d2f3bb1ed9c3da49905e33d867ac6bd7a8ac3a78 100644 (file)
@@ -493,7 +493,7 @@ func mSanSupported(goos, goarch string) bool {
 func aSanSupported(goos, goarch string) bool {
        switch goos {
        case "linux":
-               return goarch == "amd64" || goarch == "arm64"
+               return goarch == "amd64" || goarch == "arm64" || goarch == "riscv64"
        default:
                return false
        }
index d36a4baec77073d80979d4e4f6b3e33dec5d55ed..1d74f6b5e691f57a420c21799c224b3c008ab4dd 100644 (file)
@@ -40,7 +40,7 @@ func MSanSupported(goos, goarch string) bool {
 func ASanSupported(goos, goarch string) bool {
        switch goos {
        case "linux":
-               return goarch == "arm64" || goarch == "amd64"
+               return goarch == "arm64" || goarch == "amd64" || goarch == "riscv64"
        default:
                return false
        }
index 3e41d60d93c7a3344936c317dc304fc6623404ff..4359f41e3fcdf51b78b5ac1b0fcce58ea50e7cf4 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build asan && linux && (arm64 || amd64)
+//go:build asan && linux && (arm64 || amd64 || riscv64)
 
 package asan
 
diff --git a/src/runtime/asan_riscv64.s b/src/runtime/asan_riscv64.s
new file mode 100644 (file)
index 0000000..6fcd94d
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright 2022 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.
+
+//go:build asan
+
+#include "go_asm.h"
+#include "textflag.h"
+
+// Called from instrumented code.
+// func runtime·doasanread(addr unsafe.Pointer, sz, sp, pc uintptr)
+TEXT   runtime·doasanread(SB), NOSPLIT, $0-32
+       MOV     addr+0(FP), X10
+       MOV     sz+8(FP), X11
+       MOV     sp+16(FP), X12
+       MOV     pc+24(FP), X13
+       // void __asan_read_go(void *addr, uintptr_t sz);
+       MOV     $__asan_read_go(SB), X14
+       JMP     asancall<>(SB)
+
+// func runtime·doasanwrite(addr unsafe.Pointer, sz, sp, pc uintptr)
+TEXT   runtime·doasanwrite(SB), NOSPLIT, $0-32
+       MOV     addr+0(FP), X10
+       MOV     sz+8(FP), X11
+       MOV     sp+16(FP), X12
+       MOV     pc+24(FP), X13
+       // void __asan_write_go(void *addr, uintptr_t sz);
+       MOV     $__asan_write_go(SB), X14
+       JMP     asancall<>(SB)
+
+// func runtime·asanunpoison(addr unsafe.Pointer, sz uintptr)
+TEXT   runtime·asanunpoison(SB), NOSPLIT, $0-16
+       MOV     addr+0(FP), X10
+       MOV     sz+8(FP), X11
+       // void __asan_unpoison_go(void *addr, uintptr_t sz);
+       MOV     $__asan_unpoison_go(SB), X14
+       JMP     asancall<>(SB)
+
+// func runtime·asanpoison(addr unsafe.Pointer, sz uintptr)
+TEXT   runtime·asanpoison(SB), NOSPLIT, $0-16
+       MOV     addr+0(FP), X10
+       MOV     sz+8(FP), X11
+       // void __asan_poison_go(void *addr, uintptr_t sz);
+       MOV     $__asan_poison_go(SB), X14
+       JMP     asancall<>(SB)
+
+// func runtime·asanregisterglobals(addr unsafe.Pointer, n uintptr)
+TEXT   runtime·asanregisterglobals(SB), NOSPLIT, $0-16
+       MOV     addr+0(FP), X10
+       MOV     n+8(FP), X11
+       // void __asan_register_globals_go(void *addr, uintptr_t n);
+       MOV     $__asan_register_globals_go(SB), X14
+       JMP     asancall<>(SB)
+
+// Switches SP to g0 stack and calls (X14). Arguments already set.
+TEXT   asancall<>(SB), NOSPLIT, $0-0
+       MOV     X2, X8          // callee-saved
+       BEQZ    g, g0stack      // no g, still on a system stack
+       MOV     g_m(g), X21
+       MOV     m_g0(X21), X21
+       BEQ     X21, g, g0stack
+
+       MOV     (g_sched+gobuf_sp)(X21), X2
+
+g0stack:
+       JALR    RA, X14
+       MOV     X8, X2
+       RET