...

Text file src/runtime/sys_netbsd_arm.s

     1	// Copyright 2013 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, NetBSD
     6	// /usr/src/sys/kern/syscalls.master for syscall numbers.
     7	//
     8	
     9	#include "go_asm.h"
    10	#include "go_tls.h"
    11	#include "textflag.h"
    12	
    13	#define CLOCK_REALTIME		0
    14	#define CLOCK_MONOTONIC		3
    15	#define FD_CLOEXEC		1
    16	#define F_SETFD			2
    17	
    18	#define SWI_OS_NETBSD			0xa00000
    19	#define SYS_exit			SWI_OS_NETBSD | 1
    20	#define SYS_read			SWI_OS_NETBSD | 3
    21	#define SYS_write			SWI_OS_NETBSD | 4
    22	#define SYS_open			SWI_OS_NETBSD | 5
    23	#define SYS_close			SWI_OS_NETBSD | 6
    24	#define SYS_getpid			SWI_OS_NETBSD | 20
    25	#define SYS_kill			SWI_OS_NETBSD | 37
    26	#define SYS_munmap			SWI_OS_NETBSD | 73
    27	#define SYS_madvise			SWI_OS_NETBSD | 75
    28	#define SYS_fcntl			SWI_OS_NETBSD | 92
    29	#define SYS_mmap			SWI_OS_NETBSD | 197
    30	#define SYS___sysctl			SWI_OS_NETBSD | 202
    31	#define SYS___sigaltstack14		SWI_OS_NETBSD | 281
    32	#define SYS___sigprocmask14		SWI_OS_NETBSD | 293
    33	#define SYS_getcontext			SWI_OS_NETBSD | 307
    34	#define SYS_setcontext			SWI_OS_NETBSD | 308
    35	#define SYS__lwp_create			SWI_OS_NETBSD | 309
    36	#define SYS__lwp_exit			SWI_OS_NETBSD | 310
    37	#define SYS__lwp_self			SWI_OS_NETBSD | 311
    38	#define SYS__lwp_getprivate		SWI_OS_NETBSD | 316
    39	#define SYS__lwp_setprivate		SWI_OS_NETBSD | 317
    40	#define SYS__lwp_kill			SWI_OS_NETBSD | 318
    41	#define SYS__lwp_unpark			SWI_OS_NETBSD | 321
    42	#define SYS___sigaction_sigtramp	SWI_OS_NETBSD | 340
    43	#define SYS_kqueue			SWI_OS_NETBSD | 344
    44	#define SYS_sched_yield			SWI_OS_NETBSD | 350
    45	#define SYS___setitimer50		SWI_OS_NETBSD | 425
    46	#define SYS___clock_gettime50		SWI_OS_NETBSD | 427
    47	#define SYS___nanosleep50		SWI_OS_NETBSD | 430
    48	#define SYS___kevent50			SWI_OS_NETBSD | 435
    49	#define SYS____lwp_park60		SWI_OS_NETBSD | 478
    50	
    51	// Exit the entire program (like C exit)
    52	TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0
    53		MOVW code+0(FP), R0	// arg 1 exit status
    54		SWI $SYS_exit
    55		MOVW.CS $0, R8	// crash on syscall failure
    56		MOVW.CS R8, (R8)
    57		RET
    58	
    59	// func exitThread(wait *uint32)
    60	TEXT runtime·exitThread(SB),NOSPLIT,$0-4
    61		MOVW wait+0(FP), R0
    62		// We're done using the stack.
    63		MOVW $0, R2
    64	storeloop:
    65		LDREX (R0), R4          // loads R4
    66		STREX R2, (R0), R1      // stores R2
    67		CMP $0, R1
    68		BNE storeloop
    69		SWI $SYS__lwp_exit
    70		MOVW $1, R8	// crash
    71		MOVW R8, (R8)
    72		JMP 0(PC)
    73	
    74	TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0
    75		MOVW name+0(FP), R0
    76		MOVW mode+4(FP), R1
    77		MOVW perm+8(FP), R2
    78		SWI $SYS_open
    79		MOVW.CS	$-1, R0
    80		MOVW	R0, ret+12(FP)
    81		RET
    82	
    83	TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0
    84		MOVW fd+0(FP), R0
    85		SWI $SYS_close
    86		MOVW.CS	$-1, R0
    87		MOVW	R0, ret+4(FP)
    88		RET
    89	
    90	TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
    91		MOVW fd+0(FP), R0
    92		MOVW p+4(FP), R1
    93		MOVW n+8(FP), R2
    94		SWI $SYS_read
    95		MOVW.CS	$-1, R0
    96		MOVW	R0, ret+12(FP)
    97		RET
    98	
    99	TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0
   100		MOVW	fd+0(FP), R0	// arg 1 - fd
   101		MOVW	p+4(FP), R1	// arg 2 - buf
   102		MOVW	n+8(FP), R2	// arg 3 - nbyte
   103		SWI $SYS_write
   104		MOVW.CS	$-1, R0
   105		MOVW	R0, ret+12(FP)
   106		RET
   107	
   108	// int32 lwp_create(void *context, uintptr flags, void *lwpid)
   109	TEXT runtime·lwp_create(SB),NOSPLIT,$0
   110		MOVW ctxt+0(FP), R0
   111		MOVW flags+4(FP), R1
   112		MOVW lwpid+8(FP), R2
   113		SWI $SYS__lwp_create
   114		MOVW	R0, ret+12(FP)
   115		RET
   116	
   117	TEXT runtime·osyield(SB),NOSPLIT,$0
   118		SWI $SYS_sched_yield
   119		RET
   120	
   121	TEXT runtime·lwp_park(SB),NOSPLIT,$8
   122		MOVW clockid+0(FP), R0		// arg 1 - clock_id
   123		MOVW flags+4(FP), R1		// arg 2 - flags
   124		MOVW ts+8(FP), R2		// arg 3 - ts
   125		MOVW unpark+12(FP), R3		// arg 4 - unpark
   126		MOVW hint+16(FP), R4		// arg 5 - hint
   127		MOVW R4, 4(R13)
   128		MOVW unparkhint+20(FP), R5	// arg 6 - unparkhint
   129		MOVW R5, 8(R13)
   130		SWI $SYS____lwp_park60
   131		MOVW	R0, ret+24(FP)
   132		RET
   133	
   134	TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
   135		MOVW	lwp+0(FP), R0	// arg 1 - lwp
   136		MOVW	hint+4(FP), R1	// arg 2 - hint
   137		SWI	$SYS__lwp_unpark
   138		MOVW	R0, ret+8(FP)
   139		RET
   140	
   141	TEXT runtime·lwp_self(SB),NOSPLIT,$0
   142		SWI	$SYS__lwp_self
   143		MOVW	R0, ret+0(FP)
   144		RET
   145	
   146	TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
   147		MOVW R0, g_m(R1)
   148		MOVW R1, g
   149	
   150		BL runtime·emptyfunc(SB) // fault if stack check is wrong
   151		BL (R2)
   152		MOVW $2, R8  // crash (not reached)
   153		MOVW R8, (R8)
   154		RET
   155	
   156	TEXT runtime·usleep(SB),NOSPLIT,$16
   157		MOVW usec+0(FP), R0
   158		CALL runtime·usplitR0(SB)
   159		// 0(R13) is the saved LR, don't use it
   160		MOVW R0, 4(R13) // tv_sec.low
   161		MOVW $0, R0
   162		MOVW R0, 8(R13) // tv_sec.high
   163		MOVW $1000, R2
   164		MUL R1, R2
   165		MOVW R2, 12(R13) // tv_nsec
   166	
   167		MOVW $4(R13), R0 // arg 1 - rqtp
   168		MOVW $0, R1      // arg 2 - rmtp
   169		SWI $SYS___nanosleep50
   170		RET
   171	
   172	TEXT runtime·raise(SB),NOSPLIT,$16
   173		SWI	$SYS__lwp_self	// the returned R0 is arg 1
   174		MOVW	sig+0(FP), R1	// arg 2 - signal
   175		SWI	$SYS__lwp_kill
   176		RET
   177	
   178	TEXT runtime·raiseproc(SB),NOSPLIT,$16
   179		SWI	$SYS_getpid	// the returned R0 is arg 1
   180		MOVW	sig+0(FP), R1	// arg 2 - signal
   181		SWI	$SYS_kill
   182		RET
   183	
   184	TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0
   185		MOVW mode+0(FP), R0	// arg 1 - which
   186		MOVW new+4(FP), R1	// arg 2 - itv
   187		MOVW old+8(FP), R2	// arg 3 - oitv
   188		SWI $SYS___setitimer50
   189		RET
   190	
   191	// func walltime() (sec int64, nsec int32)
   192	TEXT runtime·walltime(SB), NOSPLIT, $32
   193		MOVW $0, R0	// CLOCK_REALTIME
   194		MOVW $8(R13), R1
   195		SWI $SYS___clock_gettime50
   196	
   197		MOVW 8(R13), R0	// sec.low
   198		MOVW 12(R13), R1 // sec.high
   199		MOVW 16(R13), R2 // nsec
   200	
   201		MOVW R0, sec_lo+0(FP)
   202		MOVW R1, sec_hi+4(FP)
   203		MOVW R2, nsec+8(FP)
   204		RET
   205	
   206	// int64 nanotime(void) so really
   207	// void nanotime(int64 *nsec)
   208	TEXT runtime·nanotime(SB), NOSPLIT, $32
   209		MOVW $3, R0 // CLOCK_MONOTONIC
   210		MOVW $8(R13), R1
   211		SWI $SYS___clock_gettime50
   212	
   213		MOVW 8(R13), R0 // sec.low
   214		MOVW 12(R13), R4 // sec.high
   215		MOVW 16(R13), R2 // nsec
   216	
   217		MOVW $1000000000, R3
   218		MULLU R0, R3, (R1, R0)
   219		MUL R3, R4
   220		ADD.S R2, R0
   221		ADC R4, R1
   222	
   223		MOVW R0, ret_lo+0(FP)
   224		MOVW R1, ret_hi+4(FP)
   225		RET
   226	
   227	TEXT runtime·getcontext(SB),NOSPLIT|NOFRAME,$0
   228		MOVW ctxt+0(FP), R0	// arg 1 - context
   229		SWI $SYS_getcontext
   230		MOVW.CS $0, R8	// crash on syscall failure
   231		MOVW.CS R8, (R8)
   232		RET
   233	
   234	TEXT runtime·sigprocmask(SB),NOSPLIT,$0
   235		MOVW how+0(FP), R0	// arg 1 - how
   236		MOVW new+4(FP), R1	// arg 2 - set
   237		MOVW old+8(FP), R2	// arg 3 - oset
   238		SWI $SYS___sigprocmask14
   239		MOVW.CS $0, R8	// crash on syscall failure
   240		MOVW.CS R8, (R8)
   241		RET
   242	
   243	TEXT sigreturn_tramp<>(SB),NOSPLIT|NOFRAME,$0
   244		// on entry, SP points to siginfo, we add sizeof(ucontext)
   245		// to SP to get a pointer to ucontext.
   246		ADD $0x80, R13, R0 // 0x80 == sizeof(UcontextT)
   247		SWI $SYS_setcontext
   248		// something failed, we have to exit
   249		MOVW $0x4242, R0 // magic return number
   250		SWI $SYS_exit
   251		B -2(PC)	// continue exit
   252	
   253	TEXT runtime·sigaction(SB),NOSPLIT,$4
   254		MOVW sig+0(FP), R0	// arg 1 - signum
   255		MOVW new+4(FP), R1	// arg 2 - nsa
   256		MOVW old+8(FP), R2	// arg 3 - osa
   257		MOVW $sigreturn_tramp<>(SB), R3	// arg 4 - tramp
   258		MOVW $2, R4	// arg 5 - vers
   259		MOVW R4, 4(R13)
   260		ADD $4, R13	// pass arg 5 on stack
   261		SWI $SYS___sigaction_sigtramp
   262		SUB $4, R13
   263		MOVW.CS $3, R8	// crash on syscall failure
   264		MOVW.CS R8, (R8)
   265		RET
   266	
   267	TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
   268		MOVW	sig+4(FP), R0
   269		MOVW	info+8(FP), R1
   270		MOVW	ctx+12(FP), R2
   271		MOVW	fn+0(FP), R11
   272		MOVW	R13, R4
   273		SUB	$24, R13
   274		BIC	$0x7, R13 // alignment for ELF ABI
   275		BL	(R11)
   276		MOVW	R4, R13
   277		RET
   278	
   279	TEXT runtime·sigtramp(SB),NOSPLIT,$12
   280		// this might be called in external code context,
   281		// where g is not set.
   282		// first save R0, because runtime·load_g will clobber it
   283		MOVW	R0, 4(R13) // signum
   284		MOVB	runtime·iscgo(SB), R0
   285		CMP 	$0, R0
   286		BL.NE	runtime·load_g(SB)
   287	
   288		MOVW	R1, 8(R13)
   289		MOVW	R2, 12(R13)
   290		BL	runtime·sigtrampgo(SB)
   291		RET
   292	
   293	TEXT runtime·mmap(SB),NOSPLIT,$12
   294		MOVW addr+0(FP), R0	// arg 1 - addr
   295		MOVW n+4(FP), R1	// arg 2 - len
   296		MOVW prot+8(FP), R2	// arg 3 - prot
   297		MOVW flags+12(FP), R3	// arg 4 - flags
   298		// arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack
   299		// note the C runtime only passes the 32-bit offset_lo to us
   300		MOVW fd+16(FP), R4		// arg 5
   301		MOVW R4, 4(R13)
   302		MOVW off+20(FP), R5		// arg 6 lower 32-bit
   303		MOVW R5, 8(R13)
   304		MOVW $0, R6 // higher 32-bit for arg 6
   305		MOVW R6, 12(R13)
   306		ADD $4, R13 // pass arg 5 and arg 6 on stack
   307		SWI $SYS_mmap
   308		SUB $4, R13
   309		MOVW	$0, R1
   310		MOVW.CS R0, R1	// if error, move to R1
   311		MOVW.CS $0, R0
   312		MOVW	R0, p+24(FP)
   313		MOVW	R1, err+28(FP)
   314		RET
   315	
   316	TEXT runtime·munmap(SB),NOSPLIT,$0
   317		MOVW addr+0(FP), R0	// arg 1 - addr
   318		MOVW n+4(FP), R1	// arg 2 - len
   319		SWI $SYS_munmap
   320		MOVW.CS $0, R8	// crash on syscall failure
   321		MOVW.CS R8, (R8)
   322		RET
   323	
   324	TEXT runtime·madvise(SB),NOSPLIT,$0
   325		MOVW	addr+0(FP), R0	// arg 1 - addr
   326		MOVW	n+4(FP), R1	// arg 2 - len
   327		MOVW	flags+8(FP), R2	// arg 3 - behav
   328		SWI	$SYS_madvise
   329		MOVW.CS	$-1, R0
   330		MOVW	R0, ret+12(FP)
   331		RET
   332	
   333	TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
   334		MOVW new+0(FP), R0	// arg 1 - nss
   335		MOVW old+4(FP), R1	// arg 2 - oss
   336		SWI $SYS___sigaltstack14
   337		MOVW.CS $0, R8	// crash on syscall failure
   338		MOVW.CS R8, (R8)
   339		RET
   340	
   341	TEXT runtime·sysctl(SB),NOSPLIT,$8
   342		MOVW mib+0(FP), R0	// arg 1 - name
   343		MOVW miblen+4(FP), R1	// arg 2 - namelen
   344		MOVW out+8(FP), R2	// arg 3 - oldp
   345		MOVW size+12(FP), R3	// arg 4 - oldlenp
   346		MOVW dst+16(FP), R4	// arg 5 - newp
   347		MOVW R4, 4(R13)
   348		MOVW ndst+20(FP), R4	// arg 6 - newlen
   349		MOVW R4, 8(R13)
   350		ADD $4, R13	// pass arg 5 and 6 on stack
   351		SWI $SYS___sysctl
   352		SUB $4, R13
   353		MOVW	R0, ret+24(FP)
   354		RET
   355	
   356	// int32 runtime·kqueue(void)
   357	TEXT runtime·kqueue(SB),NOSPLIT,$0
   358		SWI	$SYS_kqueue
   359		RSB.CS	$0, R0
   360		MOVW	R0, ret+0(FP)
   361		RET
   362	
   363	// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
   364	TEXT runtime·kevent(SB),NOSPLIT,$8
   365		MOVW kq+0(FP), R0	// kq
   366		MOVW ch+4(FP), R1	// changelist
   367		MOVW nch+8(FP), R2	// nchanges
   368		MOVW ev+12(FP), R3	// eventlist
   369		MOVW nev+16(FP), R4	// nevents
   370		MOVW R4, 4(R13)
   371		MOVW ts+20(FP), R4	// timeout
   372		MOVW R4, 8(R13)
   373		ADD $4, R13	// pass arg 5 and 6 on stack
   374		SWI $SYS___kevent50
   375		RSB.CS $0, R0
   376		SUB $4, R13
   377		MOVW	R0, ret+24(FP)
   378		RET
   379	
   380	// void runtime·closeonexec(int32 fd)
   381	TEXT runtime·closeonexec(SB),NOSPLIT,$0
   382		MOVW fd+0(FP), R0	// fd
   383		MOVW $F_SETFD, R1	// F_SETFD
   384		MOVW $FD_CLOEXEC, R2	// FD_CLOEXEC
   385		SWI $SYS_fcntl
   386		RET
   387	
   388	// TODO: this is only valid for ARMv7+
   389	TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0
   390		B	runtime·armPublicationBarrier(SB)
   391	
   392	TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0
   393		MOVM.WP [R1, R2, R3, R12], (R13)
   394		SWI $SYS__lwp_getprivate
   395		MOVM.IAW    (R13), [R1, R2, R3, R12]
   396		RET

View as plain text