github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/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 runtime·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  TEXT runtime·asmsyscall6(SB),NOSPLIT,$256
    34  	MOVD	R3, 48(R1) // Save libcall for later
    35  	MOVD	libcall_fn(R3), R12
    36  	MOVD	libcall_args(R3), R9
    37  	MOVD	0(R9), R3
    38  	MOVD	8(R9), R4
    39  	MOVD	16(R9), R5
    40  	MOVD	24(R9), R6
    41  	MOVD	32(R9), R7
    42  	MOVD	40(R9), R8
    43  	BL	runtime·callCfunction(SB)
    44  
    45  	// Restore R0 and TOC
    46  	XOR	R0, R0
    47  	MOVD	40(R1), R2
    48  
    49  	// Store result in libcall
    50  	MOVD	48(R1), R5
    51  	MOVD	R3, (libcall_r1)(R5)
    52  	MOVD	$-1, R6
    53  	CMP	R6, R3
    54  	BNE	skiperrno
    55  
    56      // Save errno in libcall
    57  	BL	runtime·load_g(SB)
    58  	MOVD	g_m(g), R4
    59  	MOVD	(m_mOS + mOS_perrno)(R4), R9
    60  	MOVW	0(R9), R9
    61  	MOVD	R9, (libcall_err)(R5)
    62  	RET
    63  skiperrno:
    64  	// Reset errno if no error has been returned
    65  	MOVD	R0, (libcall_err)(R5)
    66  	RET
    67  
    68  
    69  TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
    70  	MOVW	sig+8(FP), R3
    71  	MOVD	info+16(FP), R4
    72  	MOVD	ctx+24(FP), R5
    73  	MOVD	fn+0(FP), R12
    74  	MOVD	R12, CTR
    75  	BL	(CTR)
    76  	RET
    77  
    78  
    79  // runtime.sigtramp is a function descriptor to the real sigtramp.
    80  DATA	runtime·sigtramp+0(SB)/8, $runtime·_sigtramp(SB)
    81  DATA	runtime·sigtramp+8(SB)/8, $TOC(SB)
    82  DATA	runtime·sigtramp+16(SB)/8, $0
    83  GLOBL	runtime·sigtramp(SB), NOPTR, $24
    84  
    85  // This funcion must not have any frame as we want to control how
    86  // every registers are used.
    87  TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0
    88  	MOVD	LR, R0
    89  	MOVD	R0, 16(R1)
    90  	// initialize essential registers (just in case)
    91  	BL	runtime·reginit(SB)
    92  
    93  	// Note that we are executing on altsigstack here, so we have
    94  	// more stack available than NOSPLIT would have us believe.
    95  	// To defeat the linker, we make our own stack frame with
    96  	// more space.
    97  	SUB	   $128+FIXED_FRAME, R1
    98  
    99  	// Save registers
   100  	MOVD	R31, 56(R1)
   101  	MOVD	g, 64(R1)
   102  	MOVD	R29, 72(R1)
   103  
   104  	BL	runtime·load_g(SB)
   105  
   106  	// Save m->libcall. We need to do this because we
   107  	// might get interrupted by a signal in runtime·asmcgocall.
   108  
   109  	// save m->libcall
   110  	MOVD	g_m(g), R6
   111  	MOVD	(m_libcall+libcall_fn)(R6), R7
   112  	MOVD	R7, 80(R1)
   113  	MOVD	(m_libcall+libcall_args)(R6), R7
   114  	MOVD	R7, 88(R1)
   115  	MOVD	(m_libcall+libcall_n)(R6), R7
   116  	MOVD	R7, 96(R1)
   117  	MOVD	(m_libcall+libcall_r1)(R6), R7
   118  	MOVD	R7, 104(R1)
   119  	MOVD	(m_libcall+libcall_r2)(R6), R7
   120  	MOVD	R7, 112(R1)
   121  
   122  	// save errno, it might be EINTR; stuff we do here might reset it.
   123  	MOVD	(m_mOS+mOS_perrno)(R6), R8
   124  	MOVD	0(R8), R8
   125  	MOVD	R8, 120(R1)
   126  
   127  	MOVW	R3, FIXED_FRAME+0(R1)
   128  	MOVD	R4, FIXED_FRAME+8(R1)
   129  	MOVD	R5, FIXED_FRAME+16(R1)
   130  	MOVD	$runtime·sigtrampgo(SB), R12
   131  	MOVD	R12, CTR
   132  	BL	(CTR)
   133  
   134  	MOVD	g_m(g), R6
   135  	// restore libcall
   136  	MOVD	80(R1), R7
   137  	MOVD	R7, (m_libcall+libcall_fn)(R6)
   138  	MOVD	88(R1), R7
   139  	MOVD	R7, (m_libcall+libcall_args)(R6)
   140  	MOVD	96(R1), R7
   141  	MOVD	R7, (m_libcall+libcall_n)(R6)
   142  	MOVD	104(R1), R7
   143  	MOVD	R7, (m_libcall+libcall_r1)(R6)
   144  	MOVD	112(R1), R7
   145  	MOVD	R7, (m_libcall+libcall_r2)(R6)
   146  
   147  	// restore errno
   148  	MOVD	(m_mOS+mOS_perrno)(R6), R7
   149  	MOVD	120(R1), R8
   150  	MOVD	R8, 0(R7)
   151  
   152  	// restore registers
   153  	MOVD	56(R1),R31
   154  	MOVD	64(R1),g
   155  	MOVD	72(R1),R29
   156  
   157  	// Don't use RET because we need to restore R31 !
   158  	ADD $128+FIXED_FRAME, R1
   159  	MOVD	16(R1), R0
   160  	MOVD	R0, LR
   161  	BR (LR)
   162  
   163  // runtime.tstart is a function descriptor to the real tstart.
   164  DATA	runtime·tstart+0(SB)/8, $runtime·_tstart(SB)
   165  DATA	runtime·tstart+8(SB)/8, $TOC(SB)
   166  DATA	runtime·tstart+16(SB)/8, $0
   167  GLOBL	runtime·tstart(SB), NOPTR, $24
   168  
   169  TEXT runtime·_tstart(SB),NOSPLIT,$0
   170  	XOR	 R0, R0 // reset R0
   171  
   172  	// set g
   173  	MOVD	m_g0(R3), g
   174  	BL	runtime·save_g(SB)
   175  	MOVD	R3, g_m(g)
   176  
   177  	// Layout new m scheduler stack on os stack.
   178  	MOVD	R1, R3
   179  	MOVD	R3, (g_stack+stack_hi)(g)
   180  	SUB	$(const_threadStackSize), R3		// stack size
   181  	MOVD	R3, (g_stack+stack_lo)(g)
   182  	ADD	$const__StackGuard, R3
   183  	MOVD	R3, g_stackguard0(g)
   184  	MOVD	R3, g_stackguard1(g)
   185  
   186  	BL	runtime·mstart(SB)
   187  
   188  	MOVD R0, R3
   189  	RET
   190  
   191  // Runs on OS stack, called from runtime·osyield.
   192  TEXT runtime·osyield1(SB),NOSPLIT,$0
   193  	MOVD	$libc_sched_yield(SB), R12
   194  	MOVD	0(R12), R12
   195  	MOVD	R2, 40(R1)
   196  	MOVD	0(R12), R0
   197  	MOVD	8(R12), R2
   198  	MOVD	R0, CTR
   199  	BL	(CTR)
   200  	MOVD	40(R1), R2
   201  	RET