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

     1  // Copyright 2009 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 arm, Linux
     7  //
     8  
     9  #include "zasm_GOOS_GOARCH.h"
    10  
    11  // for EABI, as we don't support OABI
    12  #define SYS_BASE 0x0
    13  
    14  #define SYS_exit (SYS_BASE + 1)
    15  #define SYS_read (SYS_BASE + 3)
    16  #define SYS_write (SYS_BASE + 4)
    17  #define SYS_open (SYS_BASE + 5)
    18  #define SYS_close (SYS_BASE + 6)
    19  #define SYS_gettimeofday (SYS_BASE + 78)
    20  #define SYS_clone (SYS_BASE + 120)
    21  #define SYS_rt_sigreturn (SYS_BASE + 173)
    22  #define SYS_rt_sigaction (SYS_BASE + 174)
    23  #define SYS_rt_sigprocmask (SYS_BASE + 175)
    24  #define SYS_sigaltstack (SYS_BASE + 186)
    25  #define SYS_mmap2 (SYS_BASE + 192)
    26  #define SYS_futex (SYS_BASE + 240)
    27  #define SYS_exit_group (SYS_BASE + 248)
    28  #define SYS_munmap (SYS_BASE + 91)
    29  #define SYS_madvise (SYS_BASE + 220)
    30  #define SYS_setitimer (SYS_BASE + 104)
    31  #define SYS_mincore (SYS_BASE + 219)
    32  #define SYS_gettid (SYS_BASE + 224)
    33  #define SYS_tkill (SYS_BASE + 238)
    34  #define SYS_sched_yield (SYS_BASE + 158)
    35  #define SYS_select (SYS_BASE + 142) // newselect
    36  #define SYS_ugetrlimit (SYS_BASE + 191)
    37  #define SYS_sched_getaffinity (SYS_BASE + 242)
    38  #define SYS_clock_gettime (SYS_BASE + 263)
    39  #define SYS_epoll_create (SYS_BASE + 250)
    40  #define SYS_epoll_ctl (SYS_BASE + 251)
    41  #define SYS_epoll_wait (SYS_BASE + 252)
    42  #define SYS_epoll_create1 (SYS_BASE + 357)
    43  #define SYS_fcntl (SYS_BASE + 55)
    44  
    45  #define ARM_BASE (SYS_BASE + 0x0f0000)
    46  
    47  TEXT runtime·open(SB),7,$0
    48  	MOVW	0(FP), R0
    49  	MOVW	4(FP), R1
    50  	MOVW	8(FP), R2
    51  	MOVW	$SYS_open, R7
    52  	SWI	$0
    53  	RET
    54  
    55  TEXT runtime·close(SB),7,$0
    56  	MOVW	0(FP), R0
    57  	MOVW	$SYS_close, R7
    58  	SWI	$0
    59  	RET
    60  
    61  TEXT runtime·write(SB),7,$0
    62  	MOVW	0(FP), R0
    63  	MOVW	4(FP), R1
    64  	MOVW	8(FP), R2
    65  	MOVW	$SYS_write, R7
    66  	SWI	$0
    67  	RET
    68  
    69  TEXT runtime·read(SB),7,$0
    70  	MOVW	0(FP), R0
    71  	MOVW	4(FP), R1
    72  	MOVW	8(FP), R2
    73  	MOVW	$SYS_read, R7
    74  	SWI	$0
    75  	RET
    76  
    77  TEXT runtime·getrlimit(SB),7,$0
    78  	MOVW	0(FP), R0
    79  	MOVW	4(FP), R1
    80  	MOVW	$SYS_ugetrlimit, R7
    81  	SWI	$0
    82  	RET
    83  
    84  TEXT runtime·exit(SB),7,$-4
    85  	MOVW	0(FP), R0
    86  	MOVW	$SYS_exit_group, R7
    87  	SWI	$0
    88  	MOVW	$1234, R0
    89  	MOVW	$1002, R1
    90  	MOVW	R0, (R1)	// fail hard
    91  
    92  TEXT runtime·exit1(SB),7,$-4
    93  	MOVW	0(FP), R0
    94  	MOVW	$SYS_exit, R7
    95  	SWI	$0
    96  	MOVW	$1234, R0
    97  	MOVW	$1003, R1
    98  	MOVW	R0, (R1)	// fail hard
    99  
   100  TEXT	runtime·raise(SB),7,$-4
   101  	MOVW	$SYS_gettid, R7
   102  	SWI	$0
   103  	// arg 1 tid already in R0 from gettid
   104  	MOVW	sig+0(FP), R1	// arg 2 - signal
   105  	MOVW	$SYS_tkill, R7
   106  	SWI	$0
   107  	RET
   108  
   109  TEXT runtime·mmap(SB),7,$0
   110  	MOVW	0(FP), R0
   111  	MOVW	4(FP), R1
   112  	MOVW	8(FP), R2
   113  	MOVW	12(FP), R3
   114  	MOVW	16(FP), R4
   115  	MOVW	20(FP), R5
   116  	MOVW	$SYS_mmap2, R7
   117  	SWI	$0
   118  	MOVW	$0xfffff001, R6
   119  	CMP		R6, R0
   120  	RSB.HI	$0, R0
   121  	RET
   122  
   123  TEXT runtime·munmap(SB),7,$0
   124  	MOVW	0(FP), R0
   125  	MOVW	4(FP), R1
   126  	MOVW	$SYS_munmap, R7
   127  	SWI	$0
   128  	MOVW	$0xfffff001, R6
   129  	CMP 	R6, R0
   130  	MOVW.HI	$0, R9  // crash on syscall failure
   131  	MOVW.HI	R9, (R9)
   132  	RET
   133  
   134  TEXT runtime·madvise(SB),7,$0
   135  	MOVW	0(FP), R0
   136  	MOVW	4(FP), R1
   137  	MOVW	8(FP), R2
   138  	MOVW	$SYS_madvise, R7
   139  	SWI	$0
   140  	// ignore failure - maybe pages are locked
   141  	RET
   142  
   143  TEXT runtime·setitimer(SB),7,$0
   144  	MOVW	0(FP), R0
   145  	MOVW	4(FP), R1
   146  	MOVW	8(FP), R2
   147  	MOVW	$SYS_setitimer, R7
   148  	SWI	$0
   149  	RET
   150  
   151  TEXT runtime·mincore(SB),7,$0
   152  	MOVW	0(FP), R0
   153  	MOVW	4(FP), R1
   154  	MOVW	8(FP), R2
   155  	MOVW	$SYS_mincore, R7
   156  	SWI	$0
   157  	RET
   158  
   159  TEXT time·now(SB), 7, $32
   160  	MOVW	$0, R0  // CLOCK_REALTIME
   161  	MOVW	$8(R13), R1  // timespec
   162  	MOVW	$SYS_clock_gettime, R7
   163  	SWI	$0
   164  	
   165  	MOVW	8(R13), R0  // sec
   166  	MOVW	12(R13), R2  // nsec
   167  	
   168  	MOVW	R0, 0(FP)
   169  	MOVW	$0, R1
   170  	MOVW	R1, 4(FP)
   171  	MOVW	R2, 8(FP)
   172  	RET	
   173  
   174  // int64 nanotime(void) so really
   175  // void nanotime(int64 *nsec)
   176  TEXT runtime·nanotime(SB),7,$32
   177  	MOVW	$0, R0  // CLOCK_REALTIME
   178  	MOVW	$8(R13), R1  // timespec
   179  	MOVW	$SYS_clock_gettime, R7
   180  	SWI	$0
   181  	
   182  	MOVW	8(R13), R0  // sec
   183  	MOVW	12(R13), R2  // nsec
   184  	
   185  	MOVW	$1000000000, R3
   186  	MULLU	R0, R3, (R1, R0)
   187  	MOVW	$0, R4
   188  	ADD.S	R2, R0
   189  	ADC	R4, R1
   190  
   191  	MOVW	0(FP), R3
   192  	MOVW	R0, 0(R3)
   193  	MOVW	R1, 4(R3)
   194  	RET
   195  
   196  // int32 futex(int32 *uaddr, int32 op, int32 val,
   197  //	struct timespec *timeout, int32 *uaddr2, int32 val2);
   198  TEXT runtime·futex(SB),7,$0
   199  	MOVW	4(SP), R0
   200  	MOVW	8(SP), R1
   201  	MOVW	12(SP), R2
   202  	MOVW	16(SP), R3
   203  	MOVW	20(SP), R4
   204  	MOVW	24(SP), R5
   205  	MOVW	$SYS_futex, R7
   206  	SWI	$0
   207  	RET
   208  
   209  
   210  // int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
   211  TEXT runtime·clone(SB),7,$0
   212  	MOVW	flags+0(FP), R0
   213  	MOVW	stack+4(FP), R1
   214  	MOVW	$0, R2	// parent tid ptr
   215  	MOVW	$0, R3	// tls_val
   216  	MOVW	$0, R4	// child tid ptr
   217  	MOVW	$0, R5
   218  
   219  	// Copy mp, gp, fn off parent stack for use by child.
   220  	// TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
   221  	MOVW	$-16(R1), R1
   222  	MOVW	mm+8(FP), R6
   223  	MOVW	R6, 0(R1)
   224  	MOVW	gg+12(FP), R6
   225  	MOVW	R6, 4(R1)
   226  	MOVW	fn+16(FP), R6
   227  	MOVW	R6, 8(R1)
   228  	MOVW	$1234, R6
   229  	MOVW	R6, 12(R1)
   230  
   231  	MOVW	$SYS_clone, R7
   232  	SWI	$0
   233  
   234  	// In parent, return.
   235  	CMP	$0, R0
   236  	BEQ	2(PC)
   237  	RET
   238  
   239  	// Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
   240  	MOVW	12(R13), R0
   241  	MOVW	$1234, R1
   242  	CMP	R0, R1
   243  	BEQ	2(PC)
   244  	BL	runtime·abort(SB)
   245  
   246  	MOVW	0(R13), m
   247  	MOVW	4(R13), g
   248  
   249  	// paranoia; check they are not nil
   250  	MOVW	0(m), R0
   251  	MOVW	0(g), R0
   252  
   253  	BL	runtime·emptyfunc(SB)	// fault if stack check is wrong
   254  
   255  	// Initialize m->procid to Linux tid
   256  	MOVW	$SYS_gettid, R7
   257  	SWI	$0
   258  	MOVW	R0, m_procid(m)
   259  
   260  	// Call fn
   261  	MOVW	8(R13), R0
   262  	MOVW	$16(R13), R13
   263  	BL	(R0)
   264  
   265  	MOVW	$0, R0
   266  	MOVW	R0, 4(R13)
   267  	BL	runtime·exit1(SB)
   268  
   269  	// It shouldn't return
   270  	MOVW	$1234, R0
   271  	MOVW	$1005, R1
   272  	MOVW	R0, (R1)
   273  
   274  TEXT runtime·sigaltstack(SB),7,$0
   275  	MOVW	0(FP), R0
   276  	MOVW	4(FP), R1
   277  	MOVW	$SYS_sigaltstack, R7
   278  	SWI	$0
   279  	MOVW	$0xfffff001, R6
   280  	CMP 	R6, R0
   281  	MOVW.HI	$0, R9  // crash on syscall failure
   282  	MOVW.HI	R9, (R9)
   283  	RET
   284  
   285  TEXT runtime·sigtramp(SB),7,$24
   286  	// this might be called in external code context,
   287  	// where g and m are not set.
   288  	// first save R0, because _cgo_load_gm will clobber it
   289  	// TODO(adonovan): call runtime·badsignal if m=0, like other platforms?
   290  	MOVW	R0, 4(R13)
   291  	MOVW	_cgo_load_gm(SB), R0
   292  	CMP 	$0, R0
   293  	BL.NE	(R0)
   294  
   295  	// save g
   296  	MOVW	g, R3
   297  	MOVW	g, 20(R13)
   298  
   299  	// g = m->gsignal
   300  	MOVW	m_gsignal(m), g
   301  
   302  	// copy arguments for call to sighandler
   303  	// R0 is already saved above
   304  	MOVW	R1, 8(R13)
   305  	MOVW	R2, 12(R13)
   306  	MOVW	R3, 16(R13)
   307  
   308  	BL	runtime·sighandler(SB)
   309  
   310  	// restore g
   311  	MOVW	20(R13), g
   312  
   313  	RET
   314  
   315  TEXT runtime·rtsigprocmask(SB),7,$0
   316  	MOVW	0(FP), R0
   317  	MOVW	4(FP), R1
   318  	MOVW	8(FP), R2
   319  	MOVW	12(FP), R3
   320  	MOVW	$SYS_rt_sigprocmask, R7
   321  	SWI	$0
   322  	RET
   323  
   324  TEXT runtime·rt_sigaction(SB),7,$0
   325  	MOVW	0(FP), R0
   326  	MOVW	4(FP), R1
   327  	MOVW	8(FP), R2
   328  	MOVW	12(FP), R3
   329  	MOVW	$SYS_rt_sigaction, R7
   330  	SWI	$0
   331  	RET
   332  
   333  TEXT runtime·sigreturn(SB),7,$0
   334  	MOVW	$SYS_rt_sigreturn, R7
   335  	SWI	$0
   336  	RET
   337  
   338  TEXT runtime·usleep(SB),7,$12
   339  	MOVW	usec+0(FP), R0
   340  	MOVW	R0, R1
   341  	MOVW	$1000000, R2
   342  	DIV	R2, R0
   343  	MOD	R2, R1
   344  	MOVW	R0, 4(SP)
   345  	MOVW	R1, 8(SP)
   346  	MOVW	$0, R0
   347  	MOVW	$0, R1
   348  	MOVW	$0, R2
   349  	MOVW	$0, R3
   350  	MOVW	$4(SP), R4
   351  	MOVW	$SYS_select, R7
   352  	SWI	$0
   353  	RET
   354  
   355  // Use kernel version instead of native armcas in asm_arm.s.
   356  // See ../sync/atomic/asm_linux_arm.s for details.
   357  TEXT cas<>(SB),7,$0
   358  	MOVW	$0xffff0fc0, PC
   359  
   360  TEXT runtime·cas(SB),7,$0
   361  	MOVW	valptr+0(FP), R2
   362  	MOVW	old+4(FP), R0
   363  casagain:
   364  	MOVW	new+8(FP), R1
   365  	BL	cas<>(SB)
   366  	BCC	cascheck
   367  	MOVW $1, R0
   368  	RET
   369  cascheck:
   370  	// Kernel lies; double-check.
   371  	MOVW	valptr+0(FP), R2
   372  	MOVW	old+4(FP), R0
   373  	MOVW	0(R2), R3
   374  	CMP	R0, R3
   375  	BEQ	casagain
   376  	MOVW $0, R0
   377  	RET
   378  
   379  TEXT runtime·casp(SB),7,$0
   380  	B	runtime·cas(SB)
   381  
   382  TEXT runtime·osyield(SB),7,$0
   383  	MOVW	$SYS_sched_yield, R7
   384  	SWI	$0
   385  	RET
   386  
   387  TEXT runtime·sched_getaffinity(SB),7,$0
   388  	MOVW	0(FP), R0
   389  	MOVW	4(FP), R1
   390  	MOVW	8(FP), R2
   391  	MOVW	$SYS_sched_getaffinity, R7
   392  	SWI	$0
   393  	RET
   394  
   395  // int32 runtime·epollcreate(int32 size)
   396  TEXT runtime·epollcreate(SB),7,$0
   397  	MOVW	0(FP), R0
   398  	MOVW	$SYS_epoll_create, R7
   399  	SWI	$0
   400  	RET
   401  
   402  // int32 runtime·epollcreate1(int32 flags)
   403  TEXT runtime·epollcreate1(SB),7,$0
   404  	MOVW	0(FP), R0
   405  	MOVW	$SYS_epoll_create1, R7
   406  	SWI	$0
   407  	RET
   408  
   409  // int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev)
   410  TEXT runtime·epollctl(SB),7,$0
   411  	MOVW	0(FP), R0
   412  	MOVW	4(FP), R1
   413  	MOVW	8(FP), R2
   414  	MOVW	12(FP), R3
   415  	MOVW	$SYS_epoll_ctl, R7
   416  	SWI	$0
   417  	RET
   418  
   419  // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout)
   420  TEXT runtime·epollwait(SB),7,$0
   421  	MOVW	0(FP), R0
   422  	MOVW	4(FP), R1
   423  	MOVW	8(FP), R2
   424  	MOVW	12(FP), R3
   425  	MOVW	$SYS_epoll_wait, R7
   426  	SWI	$0
   427  	RET
   428  
   429  // void runtime·closeonexec(int32 fd)
   430  TEXT runtime·closeonexec(SB),7,$0
   431  	MOVW	0(FP), R0	// fd
   432  	MOVW	$2, R1	// F_SETFD
   433  	MOVW	$1, R2	// FD_CLOEXEC
   434  	MOVW	$SYS_fcntl, R7
   435  	SWI $0
   436  	RET