aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/preempt_riscv64.s
diff options
context:
space:
mode:
authorQuey-Liang Kao <s101062801@m101.nthu.edu.tw>2020-04-15 13:23:52 +0000
committerJoel Sing <joel@sing.id.au>2020-04-16 05:29:18 +0000
commitb89f4c67200e6128e1dc936a9362b07900c2af3e (patch)
tree963a6f9296dbfb77df256a28bfa6176bd6a039c1 /src/runtime/preempt_riscv64.s
parentab3bd2c15fb5f58f9d41feaa65a42579aca91fdc (diff)
downloadgo-b89f4c67200e6128e1dc936a9362b07900c2af3e.tar.gz
go-b89f4c67200e6128e1dc936a9362b07900c2af3e.zip
runtime: add async preemption support on riscv64
This CL adds support of call injection and async preemption on riscv64. We also clobbered REG_TMP for the injected call. Unsafe points related to REG_TMP access have been marked in previous commits. Fixes #36711. Change-Id: I1a1df5b7fc23eaafc34a6a6448fcc3c91054496e GitHub-Last-Rev: f6110d470713be70d960fd3e984fea89bb371719 GitHub-Pull-Request: golang/go#38146 Reviewed-on: https://go-review.googlesource.com/c/go/+/226206 Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Joel Sing <joel@sing.id.au> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/preempt_riscv64.s')
-rw-r--r--src/runtime/preempt_riscv64.s127
1 files changed, 125 insertions, 2 deletions
diff --git a/src/runtime/preempt_riscv64.s b/src/runtime/preempt_riscv64.s
index 80c0636c7a..0338c22a94 100644
--- a/src/runtime/preempt_riscv64.s
+++ b/src/runtime/preempt_riscv64.s
@@ -4,5 +4,128 @@
#include "textflag.h"
TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
- // No async preemption on riscv64 - see issue 36711
- UNDEF
+ MOV X1, -480(X2)
+ ADD $-480, X2
+ MOV X3, 8(X2)
+ MOV X5, 16(X2)
+ MOV X6, 24(X2)
+ MOV X7, 32(X2)
+ MOV X8, 40(X2)
+ MOV X9, 48(X2)
+ MOV X10, 56(X2)
+ MOV X11, 64(X2)
+ MOV X12, 72(X2)
+ MOV X13, 80(X2)
+ MOV X14, 88(X2)
+ MOV X15, 96(X2)
+ MOV X16, 104(X2)
+ MOV X17, 112(X2)
+ MOV X18, 120(X2)
+ MOV X19, 128(X2)
+ MOV X20, 136(X2)
+ MOV X21, 144(X2)
+ MOV X22, 152(X2)
+ MOV X23, 160(X2)
+ MOV X24, 168(X2)
+ MOV X25, 176(X2)
+ MOV X26, 184(X2)
+ MOV X27, 192(X2)
+ MOV X28, 200(X2)
+ MOV X29, 208(X2)
+ MOV X30, 216(X2)
+ MOVD F0, 224(X2)
+ MOVD F1, 232(X2)
+ MOVD F2, 240(X2)
+ MOVD F3, 248(X2)
+ MOVD F4, 256(X2)
+ MOVD F5, 264(X2)
+ MOVD F6, 272(X2)
+ MOVD F7, 280(X2)
+ MOVD F8, 288(X2)
+ MOVD F9, 296(X2)
+ MOVD F10, 304(X2)
+ MOVD F11, 312(X2)
+ MOVD F12, 320(X2)
+ MOVD F13, 328(X2)
+ MOVD F14, 336(X2)
+ MOVD F15, 344(X2)
+ MOVD F16, 352(X2)
+ MOVD F17, 360(X2)
+ MOVD F18, 368(X2)
+ MOVD F19, 376(X2)
+ MOVD F20, 384(X2)
+ MOVD F21, 392(X2)
+ MOVD F22, 400(X2)
+ MOVD F23, 408(X2)
+ MOVD F24, 416(X2)
+ MOVD F25, 424(X2)
+ MOVD F26, 432(X2)
+ MOVD F27, 440(X2)
+ MOVD F28, 448(X2)
+ MOVD F29, 456(X2)
+ MOVD F30, 464(X2)
+ MOVD F31, 472(X2)
+ CALL ·asyncPreempt2(SB)
+ MOVD 472(X2), F31
+ MOVD 464(X2), F30
+ MOVD 456(X2), F29
+ MOVD 448(X2), F28
+ MOVD 440(X2), F27
+ MOVD 432(X2), F26
+ MOVD 424(X2), F25
+ MOVD 416(X2), F24
+ MOVD 408(X2), F23
+ MOVD 400(X2), F22
+ MOVD 392(X2), F21
+ MOVD 384(X2), F20
+ MOVD 376(X2), F19
+ MOVD 368(X2), F18
+ MOVD 360(X2), F17
+ MOVD 352(X2), F16
+ MOVD 344(X2), F15
+ MOVD 336(X2), F14
+ MOVD 328(X2), F13
+ MOVD 320(X2), F12
+ MOVD 312(X2), F11
+ MOVD 304(X2), F10
+ MOVD 296(X2), F9
+ MOVD 288(X2), F8
+ MOVD 280(X2), F7
+ MOVD 272(X2), F6
+ MOVD 264(X2), F5
+ MOVD 256(X2), F4
+ MOVD 248(X2), F3
+ MOVD 240(X2), F2
+ MOVD 232(X2), F1
+ MOVD 224(X2), F0
+ MOV 216(X2), X30
+ MOV 208(X2), X29
+ MOV 200(X2), X28
+ MOV 192(X2), X27
+ MOV 184(X2), X26
+ MOV 176(X2), X25
+ MOV 168(X2), X24
+ MOV 160(X2), X23
+ MOV 152(X2), X22
+ MOV 144(X2), X21
+ MOV 136(X2), X20
+ MOV 128(X2), X19
+ MOV 120(X2), X18
+ MOV 112(X2), X17
+ MOV 104(X2), X16
+ MOV 96(X2), X15
+ MOV 88(X2), X14
+ MOV 80(X2), X13
+ MOV 72(X2), X12
+ MOV 64(X2), X11
+ MOV 56(X2), X10
+ MOV 48(X2), X9
+ MOV 40(X2), X8
+ MOV 32(X2), X7
+ MOV 24(X2), X6
+ MOV 16(X2), X5
+ MOV 8(X2), X3
+ MOV 480(X2), X1
+ MOV (X2), X31
+ ADD $488, X2
+ JMP (X31)