Black Lives Matter. Support the Equal Justice Initiative.

Text file src/runtime/sys_aix_ppc64.s

Documentation: runtime

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

View as plain text