github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/runtime/cgo/gcc_riscv64.S (about) 1 // Copyright 2020 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 /* 6 * void crosscall1(void (*fn)(void), void (*setg_gcc)(void *g), void *g) 7 * 8 * Calling into the gc tool chain, where all registers are caller save. 9 * Called from standard RISCV ELF psABI, where x8-x9, x18-x27, f8-f9 and 10 * f18-f27 are callee-save, so they must be saved explicitly, along with 11 * x1 (LR). 12 */ 13 .globl crosscall1 14 crosscall1: 15 sd x1, -200(sp) 16 addi sp, sp, -200 17 sd x8, 8(sp) 18 sd x9, 16(sp) 19 sd x18, 24(sp) 20 sd x19, 32(sp) 21 sd x20, 40(sp) 22 sd x21, 48(sp) 23 sd x22, 56(sp) 24 sd x23, 64(sp) 25 sd x24, 72(sp) 26 sd x25, 80(sp) 27 sd x26, 88(sp) 28 sd x27, 96(sp) 29 fsd f8, 104(sp) 30 fsd f9, 112(sp) 31 fsd f18, 120(sp) 32 fsd f19, 128(sp) 33 fsd f20, 136(sp) 34 fsd f21, 144(sp) 35 fsd f22, 152(sp) 36 fsd f23, 160(sp) 37 fsd f24, 168(sp) 38 fsd f25, 176(sp) 39 fsd f26, 184(sp) 40 fsd f27, 192(sp) 41 42 // a0 = *fn, a1 = *setg_gcc, a2 = *g 43 mv s1, a0 44 mv s0, a1 45 mv a0, a2 46 jalr ra, s0 // call setg_gcc (clobbers x30 aka g) 47 jalr ra, s1 // call fn 48 49 ld x1, 0(sp) 50 ld x8, 8(sp) 51 ld x9, 16(sp) 52 ld x18, 24(sp) 53 ld x19, 32(sp) 54 ld x20, 40(sp) 55 ld x21, 48(sp) 56 ld x22, 56(sp) 57 ld x23, 64(sp) 58 ld x24, 72(sp) 59 ld x25, 80(sp) 60 ld x26, 88(sp) 61 ld x27, 96(sp) 62 fld f8, 104(sp) 63 fld f9, 112(sp) 64 fld f18, 120(sp) 65 fld f19, 128(sp) 66 fld f20, 136(sp) 67 fld f21, 144(sp) 68 fld f22, 152(sp) 69 fld f23, 160(sp) 70 fld f24, 168(sp) 71 fld f25, 176(sp) 72 fld f26, 184(sp) 73 fld f27, 192(sp) 74 addi sp, sp, 200 75 76 jr ra 77 78 #ifdef __ELF__ 79 .section .note.GNU-stack,"",%progbits 80 #endif