...

Text file src/runtime/sys_aix_ppc64.s

     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·write.
   262	TEXT runtime·write1(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

View as plain text