blob: 2d70adf827399c5e3f718ffadc7d2baa4421d8e2 [file] [log] [blame]
Kai Backman79435562009-05-26 11:18:42 -07001// 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
Kai Backman770b8722009-10-29 21:21:14 -07009#include "arm/asm.h"
10
Kai Backmanbe639b92009-06-23 11:54:23 -070011#define SYS_BASE 0x00900000
12#define SYS_exit (SYS_BASE + 1)
13#define SYS_write (SYS_BASE + 4)
Kai Backman770b8722009-10-29 21:21:14 -070014#define SYS_clone (SYS_BASE + 120)
Kai Backmanbe639b92009-06-23 11:54:23 -070015#define SYS_mmap2 (SYS_BASE + 192)
Kai Backman770b8722009-10-29 21:21:14 -070016#define SYS_gettid (SYS_BASE + 224)
17#define SYS_futex (SYS_BASE + 240)
18#define SYS_exit_group (SYS_BASE + 248)
Kai Backmanbe639b92009-06-23 11:54:23 -070019
Kai Backman79435562009-05-26 11:18:42 -070020TEXT write(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070021 MOVW 0(FP), R0
22 MOVW 4(FP), R1
23 MOVW 8(FP), R2
Kai Backmanbe639b92009-06-23 11:54:23 -070024 SWI $SYS_write
Kai Backman79435562009-05-26 11:18:42 -070025 RET
26
Kai Backman6f91ba12009-10-25 11:51:16 -070027TEXT exit(SB),7,$-4
28 MOVW 0(FP), R0
Kai Backman770b8722009-10-29 21:21:14 -070029 SWI $SYS_exit_group
30 MOVW $1234, R0
31 MOVW $1002, R1
32 MOVW R0, (R1) // fail hard
33
34TEXT exit1(SB),7,$-4
35 MOVW 0(FP), R0
Kai Backmanbe639b92009-06-23 11:54:23 -070036 SWI $SYS_exit
Kai Backman770b8722009-10-29 21:21:14 -070037 MOVW $1234, R0
38 MOVW $1003, R1
39 MOVW R0, (R1) // fail hard
Kai Backman52891952009-06-10 11:53:07 -070040
Russ Cox22a5c782009-10-15 23:10:49 -070041TEXT runtime·mmap(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070042 MOVW 0(FP), R0
Kai Backmanbe639b92009-06-23 11:54:23 -070043 MOVW 4(FP), R1
44 MOVW 8(FP), R2
45 MOVW 12(FP), R3
46 MOVW 16(FP), R4
47 MOVW 20(FP), R5
48 SWI $SYS_mmap2
Kai Backman52891952009-06-10 11:53:07 -070049 RET
50
Kai Backman770b8722009-10-29 21:21:14 -070051// int32 futex(int32 *uaddr, int32 op, int32 val,
Kai Backman52891952009-06-10 11:53:07 -070052// struct timespec *timeout, int32 *uaddr2, int32 val2);
53TEXT futex(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -070054 MOVW 4(SP), R0
55 MOVW 8(SP), R1
56 MOVW 12(SP), R2
57 MOVW 16(SP), R3
58 MOVW 20(SP), R4
59 MOVW 24(SP), R5
60 SWI $SYS_futex
Kai Backman52891952009-06-10 11:53:07 -070061 RET
62
Kai Backman770b8722009-10-29 21:21:14 -070063
64// int32 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
Kai Backman52891952009-06-10 11:53:07 -070065TEXT clone(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -070066 MOVW flags+0(FP), R0
67 MOVW stack+4(FP), R1
68 MOVW $0, R2 // parent tid ptr
69 MOVW $0, R3 // tls_val
70 MOVW $0, R4 // child tid ptr
71 MOVW $0, R5
72
73 // Copy m, g, fn off parent stack for use by child.
74 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
75 MOVW $-16(R1), R1
76 MOVW mm+8(FP), R6
77 MOVW R6, 0(R1)
78 MOVW gg+12(FP), R6
79 MOVW R6, 4(R1)
80 MOVW fn+16(FP), R6
81 MOVW R6, 8(R1)
82 MOVW $1234, R6
83 MOVW R6, 12(R1)
84
85 SWI $SYS_clone
86
87 // In parent, return.
88 CMP $0, R0
89 BEQ 2(PC)
90 RET
91
92 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
93 MOVW 12(R13), R0
94 MOVW $1234, R1
95 CMP R0, R1
96 BEQ 2(PC)
97 B abort(SB)
98
99 MOVW 0(R13), m
100 MOVW 4(R13), g
101
102 // paranoia; check they are not nil
103 MOVW 0(m), R0
104 MOVW 0(g), R0
105
106 BL emptyfunc(SB) // fault if stack check is wrong
107
108 // Initialize m->procid to Linux tid
109 SWI $SYS_gettid
110 MOVW R0, m_procid(m)
111
112 // Call fn
113 MOVW 8(R13), R0
114 MOVW $16(R13), R13
115 BL (R0)
116
117 MOVW $0, R0
118 MOVW R0, 4(R13)
119 BL exit1(SB)
120
121 // It shouldn't return
122 MOVW $1234, R0
123 MOVW $1005, R1
124 MOVW R0, (R1)
125
126