Text file src/runtime/rt0_freebsd_riscv64.s

     1  // Copyright 2022 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  #include "textflag.h"
     6  
     7  // On FreeBSD argc/argv are passed in R0, not X2
     8  TEXT _rt0_riscv64_freebsd(SB),NOSPLIT|NOFRAME,$0
     9  	ADD	$8, A0, A1	// argv
    10  	MOV	0(A0), A0	// argc
    11  	JMP	main(SB)
    12  
    13  // When building with -buildmode=c-shared, this symbol is called when the shared
    14  // library is loaded.
    15  TEXT _rt0_riscv64_freebsd_lib(SB),NOSPLIT,$224
    16  	// Preserve callee-save registers, along with X1 (LR).
    17  	MOV	X1, (8*3)(X2)
    18  	MOV	X8, (8*4)(X2)
    19  	MOV	X9, (8*5)(X2)
    20  	MOV	X18, (8*6)(X2)
    21  	MOV	X19, (8*7)(X2)
    22  	MOV	X20, (8*8)(X2)
    23  	MOV	X21, (8*9)(X2)
    24  	MOV	X22, (8*10)(X2)
    25  	MOV	X23, (8*11)(X2)
    26  	MOV	X24, (8*12)(X2)
    27  	MOV	X25, (8*13)(X2)
    28  	MOV	X26, (8*14)(X2)
    29  	MOV	g, (8*15)(X2)
    30  	MOVD	F8, (8*16)(X2)
    31  	MOVD	F9, (8*17)(X2)
    32  	MOVD	F18, (8*18)(X2)
    33  	MOVD	F19, (8*19)(X2)
    34  	MOVD	F20, (8*20)(X2)
    35  	MOVD	F21, (8*21)(X2)
    36  	MOVD	F22, (8*22)(X2)
    37  	MOVD	F23, (8*23)(X2)
    38  	MOVD	F24, (8*24)(X2)
    39  	MOVD	F25, (8*25)(X2)
    40  	MOVD	F26, (8*26)(X2)
    41  	MOVD	F27, (8*27)(X2)
    42  
    43  	// Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go
    44  	MOV	X0, g
    45  
    46  	MOV	A0, _rt0_riscv64_freebsd_lib_argc<>(SB)
    47  	MOV	A1, _rt0_riscv64_freebsd_lib_argv<>(SB)
    48  
    49  	// Synchronous initialization.
    50  	MOV	$runtime·libpreinit(SB), T0
    51  	JALR	RA, T0
    52  
    53  	// Create a new thread to do the runtime initialization and return.
    54  	MOV	_cgo_sys_thread_create(SB), T0
    55  	BEQZ	T0, nocgo
    56  	MOV	$_rt0_riscv64_freebsd_lib_go(SB), A0
    57  	MOV	$0, A1
    58  	JALR	RA, T0
    59  	JMP	restore
    60  
    61  nocgo:
    62  	MOV	$0x800000, A0                     // stacksize = 8192KB
    63  	MOV	$_rt0_riscv64_freebsd_lib_go(SB), A1
    64  	MOV	A0, 8(X2)
    65  	MOV	A1, 16(X2)
    66  	MOV	$runtime·newosproc0(SB), T0
    67  	JALR	RA, T0
    68  
    69  restore:
    70  	// Restore callee-save registers, along with X1 (LR).
    71  	MOV	(8*3)(X2), X1
    72  	MOV	(8*4)(X2), X8
    73  	MOV	(8*5)(X2), X9
    74  	MOV	(8*6)(X2), X18
    75  	MOV	(8*7)(X2), X19
    76  	MOV	(8*8)(X2), X20
    77  	MOV	(8*9)(X2), X21
    78  	MOV	(8*10)(X2), X22
    79  	MOV	(8*11)(X2), X23
    80  	MOV	(8*12)(X2), X24
    81  	MOV	(8*13)(X2), X25
    82  	MOV	(8*14)(X2), X26
    83  	MOV	(8*15)(X2), g
    84  	MOVD	(8*16)(X2), F8
    85  	MOVD	(8*17)(X2), F9
    86  	MOVD	(8*18)(X2), F18
    87  	MOVD	(8*19)(X2), F19
    88  	MOVD	(8*20)(X2), F20
    89  	MOVD	(8*21)(X2), F21
    90  	MOVD	(8*22)(X2), F22
    91  	MOVD	(8*23)(X2), F23
    92  	MOVD	(8*24)(X2), F24
    93  	MOVD	(8*25)(X2), F25
    94  	MOVD	(8*26)(X2), F26
    95  	MOVD	(8*27)(X2), F27
    96  
    97  	RET
    98  
    99  TEXT _rt0_riscv64_freebsd_lib_go(SB),NOSPLIT,$0
   100  	MOV	_rt0_riscv64_freebsd_lib_argc<>(SB), A0
   101  	MOV	_rt0_riscv64_freebsd_lib_argv<>(SB), A1
   102  	MOV	$runtime·rt0_go(SB), T0
   103  	JALR	ZERO, T0
   104  
   105  DATA _rt0_riscv64_freebsd_lib_argc<>(SB)/8, $0
   106  GLOBL _rt0_riscv64_freebsd_lib_argc<>(SB),NOPTR, $8
   107  DATA _rt0_riscv64_freebsd_lib_argv<>(SB)/8, $0
   108  GLOBL _rt0_riscv64_freebsd_lib_argv<>(SB),NOPTR, $8
   109  
   110  TEXT main(SB),NOSPLIT|NOFRAME,$0
   111  	MOV	$runtime·rt0_go(SB), T0
   112  	JALR	ZERO, T0
   113  

View as plain text