github.com/lzhfromustc/gofuzz@v0.0.0-20211116160056-151b3108bbd1/runtime/sys_aix_ppc64.s (about)

     1  // Copyright 2018 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  // +build aix
     6  // +build ppc64 ppc64le
     7  
     8  //
     9  // System calls and other sys.stuff for ppc64, Aix
    10  //
    11  
    12  #include "go_asm.h"
    13  #include "go_tls.h"
    14  #include "textflag.h"
    15  #include "asm_ppc64x.h"
    16  
    17  // This function calls a C function with the function descriptor in R12
    18  TEXT callCfunction<>(SB),	NOSPLIT|NOFRAME,$0
    19  	MOVD	0(R12), R12
    20  	MOVD	R2, 40(R1)
    21  	MOVD	0(R12), R0
    22  	MOVD	8(R12), R2
    23  	MOVD	R0, CTR
    24  	BR	(CTR)
    25  
    26  
    27  // asmsyscall6 calls a library function with a function descriptor
    28  // stored in libcall_fn and store the results in libcall struture
    29  // Up to 6 arguments can be passed to this C function
    30  // Called by runtime.asmcgocall
    31  // It reserves a stack of 288 bytes for the C function.
    32  // NOT USING GO CALLING CONVENTION
    33  // runtime.asmsyscall6 is a function descriptor to the real asmsyscall6.
    34  DATA	runtime·asmsyscall6+0(SB)/8, $asmsyscall6<>(SB)
    35  DATA	runtime·asmsyscall6+8(SB)/8, $TOC(SB)
    36  DATA	runtime·asmsyscall6+16(SB)/8, $0
    37  GLOBL	runtime·asmsyscall6(SB), NOPTR, $24
    38  
    39  TEXT asmsyscall6<>(SB),NOSPLIT,$256
    40  	MOVD	R3, 48(R1) // Save libcall for later
    41  	MOVD	libcall_fn(R3), R12
    42  	MOVD	libcall_args(R3), R9
    43  	MOVD	0(R9), R3
    44  	MOVD	8(R9), R4
    45  	MOVD	16(R9), R5
    46  	MOVD	24(R9), R6
    47  	MOVD	32(R9), R7
    48  	MOVD	40(R9), R8
    49  	BL	callCfunction<>(SB)
    50  
    51  	// Restore R0 and TOC
    52  	XOR	R0, R0
    53  	MOVD	40(R1), R2
    54  
    55  	// Store result in libcall
    56  	MOVD	48(R1), R5
    57  	MOVD	R3, (libcall_r1)(R5)
    58  	MOVD	$-1, R6
    59  	CMP	R6, R3
    60  	BNE	skiperrno
    61  
    62  	// Save errno in libcall
    63  	BL	runtime·load_g(SB)
    64  	MOVD	g_m(g), R4
    65  	MOVD	(m_mOS + mOS_perrno)(R4), R9
    66  	MOVW	0(R9), R9
    67  	MOVD	R9, (libcall_err)(R5)
    68  	RET
    69  skiperrno:
    70  	// Reset errno if no error has been returned
    71  	MOVD	R0, (libcall_err)(R5)
    72  	RET
    73  
    74  
    75  TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
    76  	MOVW	sig+8(FP), R3
    77  	MOVD	info+16(FP), R4
    78  	MOVD	ctx+24(FP), R5
    79  	MOVD	fn+0(FP), R12
    80  	// fn is a function descriptor
    81  	// R2 must be saved on restore
    82  	MOVD	0(R12), R0
    83  	MOVD	R2, 40(R1)
    84  	MOVD	8(R12), R2
    85  	MOVD	R0, CTR
    86  	BL	(CTR)
    87  	MOVD	40(R1), R2
    88  	BL	runtime·reginit(SB)
    89  	RET
    90  
    91  
    92  // runtime.sigtramp is a function descriptor to the real sigtramp.
    93  DATA	runtime·sigtramp+0(SB)/8, $sigtramp<>(SB)
    94  DATA	runtime·sigtramp+8(SB)/8, $TOC(SB)
    95  DATA	runtime·sigtramp+16(SB)/8, $0
    96  GLOBL	runtime·sigtramp(SB), NOPTR, $24
    97  
    98  // This function must not have any frame as we want to control how
    99  // every registers are used.
   100  // TODO(aix): Implement SetCgoTraceback handler.
   101  TEXT sigtramp<>(SB),NOSPLIT|NOFRAME,$0
   102  	MOVD	LR, R0
   103  	MOVD	R0, 16(R1)
   104  	// initialize essential registers (just in case)
   105  	BL	runtime·reginit(SB)
   106  
   107  	// Note that we are executing on altsigstack here, so we have
   108  	// more stack available than NOSPLIT would have us believe.
   109  	// To defeat the linker, we make our own stack frame with
   110  	// more space.
   111  	SUB	$144+FIXED_FRAME, R1
   112  
   113  	// Save registers
   114  	MOVD	R31, 56(R1)
   115  	MOVD	g, 64(R1)
   116  	MOVD	R29, 72(R1)
   117  	MOVD	R14, 80(R1)
   118  	MOVD	R15, 88(R1)
   119  
   120  	BL	runtime·load_g(SB)
   121  
   122  	CMP	$0, g
   123  	BEQ	sigtramp // g == nil
   124  	MOVD	g_m(g), R6
   125  	CMP	$0, R6
   126  	BEQ	sigtramp	// g.m == nil
   127  
   128  	// Save m->libcall. We need to do this because we
   129  	// might get interrupted by a signal in runtime·asmcgocall.
   130  	MOVD	(m_libcall+libcall_fn)(R6), R7
   131  	MOVD	R7, 96(R1)
   132  	MOVD	(m_libcall+libcall_args)(R6), R7
   133  	MOVD	R7, 104(R1)
   134  	MOVD	(m_libcall+libcall_n)(R6), R7
   135  	MOVD	R7, 112(R1)
   136  	MOVD	(m_libcall+libcall_r1)(R6), R7
   137  	MOVD	R7, 120(R1)
   138  	MOVD	(m_libcall+libcall_r2)(R6), R7
   139  	MOVD	R7, 128(R1)
   140  
   141  	// save errno, it might be EINTR; stuff we do here might reset it.
   142  	MOVD	(m_mOS+mOS_perrno)(R6), R8
   143  	MOVD	0(R8), R8
   144  	MOVD	R8, 136(R1)
   145  
   146  sigtramp:
   147  	MOVW	R3, FIXED_FRAME+0(R1)
   148  	MOVD	R4, FIXED_FRAME+8(R1)
   149  	MOVD	R5, FIXED_FRAME+16(R1)
   150  	MOVD	$runtime·sigtrampgo(SB), R12
   151  	MOVD	R12, CTR
   152  	BL	(CTR)
   153  
   154  	CMP	$0, g
   155  	BEQ	exit // g == nil
   156  	MOVD	g_m(g), R6
   157  	CMP	$0, R6
   158  	BEQ	exit	// g.m == nil
   159  
   160  	// restore libcall
   161  	MOVD	96(R1), R7
   162  	MOVD	R7, (m_libcall+libcall_fn)(R6)
   163  	MOVD	104(R1), R7
   164  	MOVD	R7, (m_libcall+libcall_args)(R6)
   165  	MOVD	112(R1), R7
   166  	MOVD	R7, (m_libcall+libcall_n)(R6)
   167  	MOVD	120(R1), R7
   168  	MOVD	R7, (m_libcall+libcall_r1)(R6)
   169  	MOVD	128(R1), R7
   170  	MOVD	R7, (m_libcall+libcall_r2)(R6)
   171  
   172  	// restore errno
   173  	MOVD	(m_mOS+mOS_perrno)(R6), R7
   174  	MOVD	136(R1), R8
   175  	MOVD	R8, 0(R7)
   176  
   177  exit:
   178  	// restore registers
   179  	MOVD	56(R1),R31
   180  	MOVD	64(R1),g
   181  	MOVD	72(R1),R29
   182  	MOVD	80(R1), R14
   183  	MOVD	88(R1), R15
   184  
   185  	// Don't use RET because we need to restore R31 !
   186  	ADD $144+FIXED_FRAME, R1
   187  	MOVD	16(R1), R0
   188  	MOVD	R0, LR
   189  	BR (LR)
   190  
   191  // runtime.tstart is a function descriptor to the real tstart.
   192  DATA	runtime·tstart+0(SB)/8, $tstart<>(SB)
   193  DATA	runtime·tstart+8(SB)/8, $TOC(SB)
   194  DATA	runtime·tstart+16(SB)/8, $0
   195  GLOBL	runtime·tstart(SB), NOPTR, $24
   196  
   197  TEXT tstart<>(SB),NOSPLIT,$0
   198  	XOR	 R0, R0 // reset R0
   199  
   200  	// set g
   201  	MOVD	m_g0(R3), g
   202  	BL	runtime·save_g(SB)
   203  	MOVD	R3, g_m(g)
   204  
   205  	// Layout new m scheduler stack on os stack.
   206  	MOVD	R1, R3
   207  	MOVD	R3, (g_stack+stack_hi)(g)
   208  	SUB	$(const_threadStackSize), R3		// stack size
   209  	MOVD	R3, (g_stack+stack_lo)(g)
   210  	ADD	$const__StackGuard, R3
   211  	MOVD	R3, g_stackguard0(g)
   212  	MOVD	R3, g_stackguard1(g)
   213  
   214  	BL	runtime·mstart(SB)
   215  
   216  	MOVD R0, R3
   217  	RET
   218  
   219  
   220  #define CSYSCALL()			\
   221  	MOVD	0(R12), R12		\
   222  	MOVD	R2, 40(R1)		\
   223  	MOVD	0(R12), R0		\
   224  	MOVD	8(R12), R2		\
   225  	MOVD	R0, CTR			\
   226  	BL	(CTR)			\
   227  	MOVD	40(R1), R2		\
   228  	BL runtime·reginit(SB)
   229  
   230  
   231  // Runs on OS stack, called from runtime·osyield.
   232  TEXT runtime·osyield1(SB),NOSPLIT,$0
   233  	MOVD	$libc_sched_yield(SB), R12
   234  	CSYSCALL()
   235  	RET
   236  
   237  
   238  // Runs on OS stack, called from runtime·sigprocmask.
   239  TEXT runtime·sigprocmask1(SB),NOSPLIT,$0-24
   240  	MOVD	how+0(FP), R3
   241  	MOVD	new+8(FP), R4
   242  	MOVD	old+16(FP), R5
   243  	MOVD	$libpthread_sigthreadmask(SB), R12
   244  	CSYSCALL()
   245  	RET
   246  
   247  // Runs on OS stack, called from runtime·usleep.
   248  TEXT runtime·usleep1(SB),NOSPLIT,$0-4
   249  	MOVW	us+0(FP), R3
   250  	MOVD	$libc_usleep(SB), R12
   251  	CSYSCALL()
   252  	RET
   253  
   254  // Runs on OS stack, called from runtime·exit.
   255  TEXT runtime·exit1(SB),NOSPLIT,$0-4
   256  	MOVW	code+0(FP), R3
   257  	MOVD	$libc_exit(SB), R12
   258  	CSYSCALL()
   259  	RET
   260  
   261  // Runs on OS stack, called from runtime·write1.
   262  TEXT runtime·write2(SB),NOSPLIT,$0-28
   263  	MOVD	fd+0(FP), R3
   264  	MOVD	p+8(FP), R4
   265  	MOVW	n+16(FP), R5
   266  	MOVD	$libc_write(SB), R12
   267  	CSYSCALL()
   268  	MOVW	R3, ret+24(FP)
   269  	RET
   270  
   271  // Runs on OS stack, called from runtime·pthread_attr_init.
   272  TEXT runtime·pthread_attr_init1(SB),NOSPLIT,$0-12
   273  	MOVD	attr+0(FP), R3
   274  	MOVD	$libpthread_attr_init(SB), R12
   275  	CSYSCALL()
   276  	MOVW	R3, ret+8(FP)
   277  	RET
   278  
   279  // Runs on OS stack, called from runtime·pthread_attr_setstacksize.
   280  TEXT runtime·pthread_attr_setstacksize1(SB),NOSPLIT,$0-20
   281  	MOVD	attr+0(FP), R3
   282  	MOVD	size+8(FP), R4
   283  	MOVD	$libpthread_attr_setstacksize(SB), R12
   284  	CSYSCALL()
   285  	MOVW	R3, ret+16(FP)
   286  	RET
   287  
   288  // Runs on OS stack, called from runtime·pthread_setdetachstate.
   289  TEXT runtime·pthread_attr_setdetachstate1(SB),NOSPLIT,$0-20
   290  	MOVD	attr+0(FP), R3
   291  	MOVW	state+8(FP), R4
   292  	MOVD	$libpthread_attr_setdetachstate(SB), R12
   293  	CSYSCALL()
   294  	MOVW	R3, ret+16(FP)
   295  	RET
   296  
   297  // Runs on OS stack, called from runtime·pthread_create.
   298  TEXT runtime·pthread_create1(SB),NOSPLIT,$0-36
   299  	MOVD	tid+0(FP), R3
   300  	MOVD	attr+8(FP), R4
   301  	MOVD	fn+16(FP), R5
   302  	MOVD	arg+24(FP), R6
   303  	MOVD	$libpthread_create(SB), R12
   304  	CSYSCALL()
   305  	MOVW	R3, ret+32(FP)
   306  	RET
   307  
   308  // Runs on OS stack, called from runtime·sigaction.
   309  TEXT runtime·sigaction1(SB),NOSPLIT,$0-24
   310  	MOVD	sig+0(FP), R3
   311  	MOVD	new+8(FP), R4
   312  	MOVD	old+16(FP), R5
   313  	MOVD	$libc_sigaction(SB), R12
   314  	CSYSCALL()
   315  	RET