github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_freebsd_arm.s (about)

     1  // Copyright 2012 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  // System calls and other sys.stuff for ARM, FreeBSD
     6  // /usr/src/sys/kern/syscalls.master for syscall numbers.
     7  //
     8  
     9  #include "zasm_GOOS_GOARCH.h"
    10  	
    11  TEXT runtime·sys_umtx_op(SB),7,$0
    12  	MOVW 0(FP), R0
    13  	MOVW 4(FP), R1
    14  	MOVW 8(FP), R2
    15  	MOVW 12(FP), R3
    16  	ADD $20, R13 // arg 5 is passed on stack
    17  	SWI $454
    18  	SUB $20, R13
    19  	// BCS error
    20  	RET
    21  
    22  TEXT runtime·thr_new(SB),7,$0
    23  	MOVW 0(FP), R0
    24  	MOVW 4(FP), R1
    25  	SWI $455
    26  	RET
    27  
    28  TEXT runtime·thr_start(SB),7,$0
    29  	MOVW R0, R9 // m
    30  
    31  	// TODO(minux): set up TLS?
    32  
    33  	// set up g
    34  	MOVW m_g0(R9), R10
    35  	BL runtime·emptyfunc(SB) // fault if stack check is wrong
    36  	BL runtime·mstart(SB)
    37  
    38  	MOVW $2, R9  // crash (not reached)
    39  	MOVW R9, (R9)
    40  	RET
    41  
    42  // Exit the entire program (like C exit)
    43  TEXT runtime·exit(SB),7,$-8
    44  	MOVW 0(FP), R0	// arg 1 exit status
    45  	SWI $1
    46  	MOVW.CS $0, R9 // crash on syscall failure
    47  	MOVW.CS R9, (R9)
    48  	RET
    49  
    50  TEXT runtime·exit1(SB),7,$-8
    51  	MOVW 0(FP), R0	// arg 1 exit status
    52  	SWI $431
    53  	MOVW.CS $0, R9 // crash on syscall failure
    54  	MOVW.CS R9, (R9)
    55  	RET
    56  
    57  TEXT runtime·open(SB),7,$-8
    58  	MOVW 0(FP), R0	// arg 1 name
    59  	MOVW 4(FP), R1	// arg 2 mode
    60  	MOVW 8(FP), R2	// arg 3 perm
    61  	SWI $5
    62  	RET
    63  
    64  TEXT runtime·read(SB),7,$-8
    65  	MOVW 0(FP), R0	// arg 1 fd
    66  	MOVW 4(FP), R1	// arg 2 buf
    67  	MOVW 8(FP), R2	// arg 3 count
    68  	SWI $3
    69  	RET
    70  
    71  TEXT runtime·write(SB),7,$-8
    72  	MOVW 0(FP), R0	// arg 1 fd
    73  	MOVW 4(FP), R1	// arg 2 buf
    74  	MOVW 8(FP), R2	// arg 3 count
    75  	SWI $4
    76  	RET
    77  
    78  TEXT runtime·close(SB),7,$-8
    79  	MOVW 0(FP), R0	// arg 1 fd
    80  	SWI $6
    81  	RET
    82  
    83  TEXT runtime·getrlimit(SB),7,$-8
    84  	MOVW 0(FP), R0
    85  	MOVW 4(FP), R1
    86  	MOVW 8(FP), R2
    87  	SWI $194
    88  	RET
    89  
    90  TEXT runtime·raise(SB),7,$8
    91  	// thr_self(&4(R13))
    92  	MOVW $4(R13), R0 // arg 1 &4(R13)
    93  	SWI $432
    94  	// thr_kill(self, SIGPIPE)
    95  	MOVW 4(R13), R0	// arg 1 id
    96  	MOVW sig+0(FP), R1	// arg 2 - signal
    97  	SWI $433
    98  	RET
    99  
   100  TEXT runtime·setitimer(SB), 7, $-8
   101  	MOVW 0(FP), R0
   102  	MOVW 4(FP), R1
   103  	MOVW 8(FP), R2
   104  	SWI $83
   105  	RET
   106  
   107  // func now() (sec int64, nsec int32)
   108  TEXT time·now(SB), 7, $32
   109  	MOVW $0, R0 // CLOCK_REALTIME
   110  	MOVW $8(R13), R1
   111  	SWI $232 // clock_gettime
   112  
   113  	MOVW 8(R13), R0 // sec.low
   114  	MOVW 12(R13), R1 // sec.high
   115  	MOVW 16(R13), R2 // nsec
   116  
   117  	MOVW R0, 0(FP)
   118  	MOVW R1, 4(FP)
   119  	MOVW R2, 8(FP)
   120  	RET
   121  
   122  // int64 nanotime(void) so really
   123  // void nanotime(int64 *nsec)
   124  TEXT runtime·nanotime(SB), 7, $32
   125  	MOVW $0, R0 // CLOCK_REALTIME
   126  	MOVW $8(R13), R1
   127  	SWI $232 // clock_gettime
   128  
   129  	MOVW 8(R13), R0 // sec.low
   130  	MOVW 12(R13), R4 // sec.high
   131  	MOVW 16(R13), R2 // nsec
   132  
   133  	MOVW $1000000000, R3
   134  	MULLU R0, R3, (R1, R0)
   135  	MUL R3, R4
   136  	ADD.S R2, R0
   137  	ADC R4, R1
   138  
   139  	MOVW 0(FP), R3
   140  	MOVW R0, 0(R3)
   141  	MOVW R1, 4(R3)
   142  	RET
   143  
   144  TEXT runtime·sigaction(SB),7,$-8
   145  	MOVW 0(FP), R0		// arg 1 sig
   146  	MOVW 4(FP), R1		// arg 2 act
   147  	MOVW 8(FP), R2		// arg 3 oact
   148  	SWI $416
   149  	MOVW.CS $0, R9 // crash on syscall failure
   150  	MOVW.CS R9, (R9)
   151  	RET
   152  
   153  TEXT runtime·sigtramp(SB),7,$24
   154  	// this might be called in external code context,
   155  	// where g and m are not set.
   156  	// first save R0, because _cgo_load_gm will clobber it
   157  	// TODO(adonovan): call runtime·badsignal if m=0, like other platforms?
   158  	MOVW	R0, 4(R13) // signum
   159  	MOVW	_cgo_load_gm(SB), R0
   160  	CMP 	$0, R0
   161  	BL.NE	(R0)
   162  
   163  	// save g
   164  	MOVW R10, R4
   165  	MOVW R10, 20(R13)
   166  
   167  	// g = m->signal
   168  	MOVW m_gsignal(R9), R10
   169  
   170  	// R0 is already saved
   171  	MOVW R1, 8(R13) // info
   172  	MOVW R2, 12(R13) // context
   173  	MOVW R4, 16(R13) // oldg
   174  
   175  	BL runtime·sighandler(SB)
   176  
   177  	// restore g
   178  	MOVW 20(R13), R10
   179  	RET
   180  
   181  TEXT runtime·mmap(SB),7,$12
   182  	MOVW 0(FP), R0		// arg 1 addr
   183  	MOVW 4(FP), R1		// arg 2 len
   184  	MOVW 8(FP), R2		// arg 3 prot
   185  	MOVW 12(FP), R3		// arg 4 flags
   186  	// arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack
   187  	// note the C runtime only passes the 32-bit offset_lo to us
   188  	MOVW 16(FP), R4		// arg 5
   189  	MOVW R4, 4(R13)
   190  	MOVW 20(FP), R5		// arg 6 lower 32-bit
   191  	MOVW R5, 8(R13)
   192  	MOVW $0, R6 // higher 32-bit for arg 6
   193  	MOVW R6, 12(R13)
   194  	ADD $4, R13 // pass arg 5 and arg 6 on stack
   195  	SWI $477
   196  	SUB $4, R13
   197  	RET
   198  
   199  TEXT runtime·munmap(SB),7,$0
   200  	MOVW 0(FP), R0		// arg 1 addr
   201  	MOVW 4(FP), R1		// arg 2 len
   202  	SWI $73
   203  	MOVW.CS $0, R9 // crash on syscall failure
   204  	MOVW.CS R9, (R9)
   205  	RET
   206  
   207  TEXT runtime·madvise(SB),7,$0
   208  	MOVW 0(FP), R0		// arg 1 addr
   209  	MOVW 4(FP), R1		// arg 2 len
   210  	MOVW 8(FP), R2		// arg 3 flags
   211  	SWI $75
   212  	// ignore failure - maybe pages are locked
   213  	RET
   214  	
   215  TEXT runtime·sigaltstack(SB),7,$-8
   216  	MOVW new+0(FP), R0
   217  	MOVW old+4(FP), R1
   218  	SWI $53
   219  	MOVW.CS $0, R9 // crash on syscall failure
   220  	MOVW.CS R9, (R9)
   221  	RET
   222  
   223  TEXT runtime·usleep(SB),7,$16
   224  	MOVW usec+0(FP), R0
   225  	MOVW R0, R2
   226  	MOVW $1000000, R1
   227  	DIV R1, R0
   228  	// 0(R13) is the saved LR, don't use it
   229  	MOVW R0, 4(R13) // tv_sec.low
   230  	MOVW $0, R0
   231  	MOVW R0, 8(R13) // tv_sec.high
   232  	MOD R1, R2
   233  	MOVW $1000, R1
   234  	MUL R1, R2
   235  	MOVW R2, 12(R13) // tv_nsec
   236  
   237  	MOVW $4(R13), R0 // arg 1 - rqtp
   238  	MOVW $0, R1      // arg 2 - rmtp
   239  	SWI $240 // sys_nanosleep
   240  	RET
   241  
   242  TEXT runtime·sysctl(SB),7,$0
   243  	MOVW 0(FP), R0	// arg 1 - name
   244  	MOVW 4(FP), R1	// arg 2 - namelen
   245  	MOVW 8(FP), R2	// arg 3 - oldp
   246  	MOVW 12(FP), R3	// arg 4 - oldlenp
   247  	// arg 5 (newp) and arg 6 (newlen) are passed on stack
   248  	ADD $20, R13
   249  	SWI $202 // sys___sysctl
   250  	SUB.CS $0, R0, R0
   251  	SUB $20, R13
   252  	RET
   253  
   254  TEXT runtime·osyield(SB),7,$-4
   255  	SWI $331	// sys_sched_yield
   256  	RET
   257  
   258  TEXT runtime·sigprocmask(SB),7,$0
   259  	MOVW $3, R0	// arg 1 - how (SIG_SETMASK)
   260  	MOVW 0(FP), R1	// arg 2 - set
   261  	MOVW 4(FP), R2	// arg 3 - oset
   262  	SWI $340	// sys_sigprocmask
   263  	MOVW.CS $0, R9 // crash on syscall failure
   264  	MOVW.CS R9, (R9)
   265  	RET
   266  
   267  TEXT runtime·casp(SB),7,$0
   268  	B	runtime·cas(SB)
   269  
   270  // TODO(minux): this is only valid for ARMv6+
   271  // bool armcas(int32 *val, int32 old, int32 new)
   272  // Atomically:
   273  //	if(*val == old){
   274  //		*val = new;
   275  //		return 1;
   276  //	}else
   277  //		return 0;
   278  TEXT runtime·cas(SB),7,$0
   279  	B runtime·armcas(SB)