Text file src/runtime/sys_plan9_arm.s

     1  // Copyright 2015 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 "go_asm.h"
     6  #include "go_tls.h"
     7  #include "textflag.h"
     8  
     9  // from ../syscall/zsysnum_plan9.go
    10  
    11  #define SYS_SYSR1       0
    12  #define SYS_BIND        2
    13  #define SYS_CHDIR       3
    14  #define SYS_CLOSE       4
    15  #define SYS_DUP         5
    16  #define SYS_ALARM       6
    17  #define SYS_EXEC        7
    18  #define SYS_EXITS       8
    19  #define SYS_FAUTH       10
    20  #define SYS_SEGBRK      12
    21  #define SYS_OPEN        14
    22  #define SYS_OSEEK       16
    23  #define SYS_SLEEP       17
    24  #define SYS_RFORK       19
    25  #define SYS_PIPE        21
    26  #define SYS_CREATE      22
    27  #define SYS_FD2PATH     23
    28  #define SYS_BRK_        24
    29  #define SYS_REMOVE      25
    30  #define SYS_NOTIFY      28
    31  #define SYS_NOTED       29
    32  #define SYS_SEGATTACH   30
    33  #define SYS_SEGDETACH   31
    34  #define SYS_SEGFREE     32
    35  #define SYS_SEGFLUSH    33
    36  #define SYS_RENDEZVOUS  34
    37  #define SYS_UNMOUNT     35
    38  #define SYS_SEMACQUIRE  37
    39  #define SYS_SEMRELEASE  38
    40  #define SYS_SEEK        39
    41  #define SYS_FVERSION    40
    42  #define SYS_ERRSTR      41
    43  #define SYS_STAT        42
    44  #define SYS_FSTAT       43
    45  #define SYS_WSTAT       44
    46  #define SYS_FWSTAT      45
    47  #define SYS_MOUNT       46
    48  #define SYS_AWAIT       47
    49  #define SYS_PREAD       50
    50  #define SYS_PWRITE      51
    51  #define SYS_TSEMACQUIRE 52
    52  #define SYS_NSEC        53
    53  
    54  //func open(name *byte, mode, perm int32) int32
    55  TEXT runtime·open(SB),NOSPLIT,$0-16
    56  	MOVW    $SYS_OPEN, R0
    57  	SWI	$0
    58  	MOVW	R0, ret+12(FP)
    59  	RET
    60  
    61  //func pread(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
    62  TEXT runtime·pread(SB),NOSPLIT,$0-24
    63  	MOVW    $SYS_PREAD, R0
    64  	SWI	$0
    65  	MOVW	R0, ret+20(FP)
    66  	RET
    67  
    68  //func pwrite(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
    69  TEXT runtime·pwrite(SB),NOSPLIT,$0-24
    70  	MOVW    $SYS_PWRITE, R0
    71  	SWI	$0
    72  	MOVW	R0, ret+20(FP)
    73  	RET
    74  
    75  //func seek(fd int32, offset int64, whence int32) int64
    76  TEXT runtime·seek(SB),NOSPLIT,$0-24
    77  	MOVW	$ret_lo+16(FP), R0
    78  	MOVW	0(R13), R1
    79  	MOVW	R0, 0(R13)
    80  	MOVW.W	R1, -4(R13)
    81  	MOVW	$SYS_SEEK, R0
    82  	SWI	$0
    83  	MOVW.W	R1, 4(R13)
    84  	CMP	$-1, R0
    85  	MOVW.EQ	R0, ret_lo+16(FP)
    86  	MOVW.EQ	R0, ret_hi+20(FP)
    87  	RET
    88  
    89  //func closefd(fd int32) int32
    90  TEXT runtime·closefd(SB),NOSPLIT,$0-8
    91  	MOVW	$SYS_CLOSE, R0
    92  	SWI	$0
    93  	MOVW	R0, ret+4(FP)
    94  	RET
    95  
    96  //func exits(msg *byte)
    97  TEXT runtime·exits(SB),NOSPLIT,$0-4
    98  	MOVW    $SYS_EXITS, R0
    99  	SWI	$0
   100  	RET
   101  
   102  //func brk_(addr unsafe.Pointer) int32
   103  TEXT runtime·brk_(SB),NOSPLIT,$0-8
   104  	MOVW    $SYS_BRK_, R0
   105  	SWI	$0
   106  	MOVW	R0, ret+4(FP)
   107  	RET
   108  
   109  //func sleep(ms int32) int32
   110  TEXT runtime·sleep(SB),NOSPLIT,$0-8
   111  	MOVW    $SYS_SLEEP, R0
   112  	SWI	$0
   113  	MOVW	R0, ret+4(FP)
   114  	RET
   115  
   116  //func plan9_semacquire(addr *uint32, block int32) int32
   117  TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0-12
   118  	MOVW	$SYS_SEMACQUIRE, R0
   119  	SWI	$0
   120  	MOVW	R0, ret+8(FP)
   121  	RET
   122  
   123  //func plan9_tsemacquire(addr *uint32, ms int32) int32
   124  TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0-12
   125  	MOVW	$SYS_TSEMACQUIRE, R0
   126  	SWI	$0
   127  	MOVW	R0, ret+8(FP)
   128  	RET
   129  
   130  //func nsec(*int64) int64
   131  TEXT runtime·nsec(SB),NOSPLIT|NOFRAME,$0-12
   132  	MOVW	$SYS_NSEC, R0
   133  	SWI	$0
   134  	MOVW	arg+0(FP), R1
   135  	MOVW	0(R1), R0
   136  	MOVW	R0, ret_lo+4(FP)
   137  	MOVW	4(R1), R0
   138  	MOVW	R0, ret_hi+8(FP)
   139  	RET
   140  
   141  // func walltime() (sec int64, nsec int32)
   142  TEXT runtime·walltime(SB),NOSPLIT,$12-12
   143  	// use nsec system call to get current time in nanoseconds
   144  	MOVW	$sysnsec_lo-8(SP), R0	// destination addr
   145  	MOVW	R0,res-12(SP)
   146  	MOVW	$SYS_NSEC, R0
   147  	SWI	$0
   148  	MOVW	sysnsec_lo-8(SP), R1	// R1:R2 = nsec
   149  	MOVW	sysnsec_hi-4(SP), R2
   150  
   151  	// multiply nanoseconds by reciprocal of 10**9 (scaled by 2**61)
   152  	// to get seconds (96 bit scaled result)
   153  	MOVW	$0x89705f41, R3		// 2**61 * 10**-9
   154  	MULLU	R1,R3,(R6,R5)		// R5:R6:R7 = R1:R2 * R3
   155  	MOVW	$0,R7
   156  	MULALU	R2,R3,(R7,R6)
   157  
   158  	// unscale by discarding low 32 bits, shifting the rest by 29
   159  	MOVW	R6>>29,R6		// R6:R7 = (R5:R6:R7 >> 61)
   160  	ORR	R7<<3,R6
   161  	MOVW	R7>>29,R7
   162  
   163  	// subtract (10**9 * sec) from nsec to get nanosecond remainder
   164  	MOVW	$1000000000, R5		// 10**9
   165  	MULLU	R6,R5,(R9,R8)		// R8:R9 = R6:R7 * R5
   166  	MULA	R7,R5,R9,R9
   167  	SUB.S	R8,R1			// R1:R2 -= R8:R9
   168  	SBC	R9,R2
   169  
   170  	// because reciprocal was a truncated repeating fraction, quotient
   171  	// may be slightly too small -- adjust to make remainder < 10**9
   172  	CMP	R5,R1			// if remainder > 10**9
   173  	SUB.HS	R5,R1			//    remainder -= 10**9
   174  	ADD.HS	$1,R6			//    sec += 1
   175  
   176  	MOVW	R6,sec_lo+0(FP)
   177  	MOVW	R7,sec_hi+4(FP)
   178  	MOVW	R1,nsec+8(FP)
   179  	RET
   180  
   181  //func notify(fn unsafe.Pointer) int32
   182  TEXT runtime·notify(SB),NOSPLIT,$0-8
   183  	MOVW	$SYS_NOTIFY, R0
   184  	SWI	$0
   185  	MOVW	R0, ret+4(FP)
   186  	RET
   187  
   188  //func noted(mode int32) int32
   189  TEXT runtime·noted(SB),NOSPLIT,$0-8
   190  	MOVW	$SYS_NOTED, R0
   191  	SWI	$0
   192  	MOVW	R0, ret+4(FP)
   193  	RET
   194  
   195  //func plan9_semrelease(addr *uint32, count int32) int32
   196  TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0-12
   197  	MOVW	$SYS_SEMRELEASE, R0
   198  	SWI	$0
   199  	MOVW	R0, ret+8(FP)
   200  	RET
   201  
   202  //func rfork(flags int32) int32
   203  TEXT runtime·rfork(SB),NOSPLIT,$0-8
   204  	MOVW	$SYS_RFORK, R0
   205  	SWI	$0
   206  	MOVW	R0, ret+4(FP)
   207  	RET
   208  
   209  //func tstart_plan9(newm *m)
   210  TEXT runtime·tstart_plan9(SB),NOSPLIT,$4-4
   211  	MOVW	newm+0(FP), R1
   212  	MOVW	m_g0(R1), g
   213  
   214  	// Layout new m scheduler stack on os stack.
   215  	MOVW	R13, R0
   216  	MOVW	R0, g_stack+stack_hi(g)
   217  	SUB	$(64*1024), R0
   218  	MOVW	R0, (g_stack+stack_lo)(g)
   219  	MOVW	R0, g_stackguard0(g)
   220  	MOVW	R0, g_stackguard1(g)
   221  
   222  	// Initialize procid from TOS struct.
   223  	MOVW	_tos(SB), R0
   224  	MOVW	48(R0), R0
   225  	MOVW	R0, m_procid(R1)	// save pid as m->procid
   226  
   227  	BL	runtime·mstart(SB)
   228  
   229  	// Exit the thread.
   230  	MOVW	$0, R0
   231  	MOVW	R0, 4(R13)
   232  	CALL	runtime·exits(SB)
   233  	JMP	0(PC)
   234  
   235  //func sigtramp(ureg, note unsafe.Pointer)
   236  TEXT runtime·sigtramp(SB),NOSPLIT,$0-8
   237  	// check that g and m exist
   238  	CMP	$0, g
   239  	BEQ	4(PC)
   240  	MOVW	g_m(g), R0
   241  	CMP 	$0, R0
   242  	BNE	2(PC)
   243  	BL	runtime·badsignal2(SB)	// will exit
   244  
   245  	// save args
   246  	MOVW	ureg+0(FP), R1
   247  	MOVW	note+4(FP), R2
   248  
   249  	// change stack
   250  	MOVW	m_gsignal(R0), R3
   251  	MOVW	(g_stack+stack_hi)(R3), R13
   252  
   253  	// make room for args, retval and g
   254  	SUB	$24, R13
   255  
   256  	// save g
   257  	MOVW	g, R3
   258  	MOVW	R3, 20(R13)
   259  
   260  	// g = m->gsignal
   261  	MOVW	m_gsignal(R0), g
   262  
   263  	// load args and call sighandler
   264  	ADD	$4,R13,R5
   265  	MOVM.IA	[R1-R3], (R5)
   266  	BL	runtime·sighandler(SB)
   267  	MOVW	16(R13), R0			// retval
   268  
   269  	// restore g
   270  	MOVW	20(R13), g
   271  
   272  	// call noted(R0)
   273  	MOVW	R0, 4(R13)
   274  	BL	runtime·noted(SB)
   275  	RET
   276  
   277  //func sigpanictramp()
   278  TEXT  runtime·sigpanictramp(SB),NOSPLIT,$0-0
   279  	MOVW.W	R0, -4(R13)
   280  	B	runtime·sigpanic(SB)
   281  
   282  //func setfpmasks()
   283  // Only used by the 64-bit runtime.
   284  TEXT runtime·setfpmasks(SB),NOSPLIT,$0
   285  	RET
   286  
   287  #define ERRMAX 128	/* from os_plan9.h */
   288  
   289  // func errstr() string
   290  // Only used by package syscall.
   291  // Grab error string due to a syscall made
   292  // in entersyscall mode, without going
   293  // through the allocator (issue 4994).
   294  // See ../syscall/asm_plan9_arm.s:/·Syscall/
   295  TEXT runtime·errstr(SB),NOSPLIT,$0-8
   296  	MOVW	g_m(g), R0
   297  	MOVW	(m_mOS+mOS_errstr)(R0), R1
   298  	MOVW	R1, ret_base+0(FP)
   299  	MOVW	$ERRMAX, R2
   300  	MOVW	R2, ret_len+4(FP)
   301  	MOVW    $SYS_ERRSTR, R0
   302  	SWI	$0
   303  	MOVW	R1, R2
   304  	MOVBU	0(R2), R0
   305  	CMP	$0, R0
   306  	BEQ	3(PC)
   307  	ADD	$1, R2
   308  	B	-4(PC)
   309  	SUB	R1, R2
   310  	MOVW	R2, ret_len+4(FP)
   311  	RET
   312  
   313  TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0
   314  	B	runtime·armPublicationBarrier(SB)
   315  
   316  // never called (cgo not supported)
   317  TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0
   318  	MOVW	$0, R0
   319  	MOVW	R0, (R0)
   320  	RET
   321  

View as plain text