xref: /plan9-contrib/sys/src/libc/9syscall/mkfile (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1NPROC=1
2</$objtype/mkfile
3
4install:V:
5	SYS=`{sed '/^#define._X[123]/d; s/#define.([A-Z0-9_]*).*/\1/' sys.h}
6	for(I in $SYS) {
7		i=`{echo $I|tr A-Z a-z}
8		n=`{sed -n '/[ 	]'$I'[ 	]/s/.*	//p' sys.h}
9		if(~ $i exits) i=_exits
10		{switch($objtype){
11		case mips
12			echo TEXT $i'(SB)', 1, '$0'
13			echo MOVW R1, '0(FP)'
14			echo MOVW '$'$n, R1
15			echo SYSCALL
16			if(~ $i seek || ~ $i nsec) {
17				echo 'MOVW $-1,R5
18				BNE R1,R5,4(PC)
19				MOVW a+0(FP),R5
20				MOVW R1,0(R5)
21				MOVW R1,4(R5)'
22			}
23			echo RET
24		case mips2
25			echo TEXT $i'(SB)', 1, '$0'
26			echo MOVW R1, '0(FP)'
27			echo MOVW '$'$n, R1
28			echo ADD '$4',R29
29			echo SYSCALL
30			echo ADD '$-4',R29
31			echo RET
32		case spim
33			echo TEXT $i'(SB)', 1, '$0'
34			echo MOVW R1, '0(FP)'
35			echo MOVW '$'$n, R1
36			echo ADD '$4',R29
37			echo SYSCALL
38			echo ADD '$-4',R29
39			if(~ $i seek || ~ $i nsec) {	# untested so far - geoff
40				echo 'MOVW $-1,R5
41				BNE R1,R5,4(PC)
42				MOVW a+0(FP),R5
43				MOVW R1,0(R5)
44				MOVW R1,4(R5)'
45			}
46			echo RET
47		case mips64
48			if(~ $i seek || ~ $i nsec)
49				echo TEXT _$i'(SB)', 1, '$0'
50			if not
51				echo TEXT $i'(SB)', 1, '$0'
52			echo MOVV R1, '0(FP)'
53			echo MOVW '$'$n, R1
54			echo ADDV '$8',R29
55			echo SYSCALL
56			echo ADDV '$-8',R29
57			echo RET
58		case spim64
59			if(~ $i seek || ~ $i nsec)
60				echo TEXT _$i'(SB)', 1, '$0'
61			if not
62				echo TEXT $i'(SB)', 1, '$0'
63			echo MOVV R1, '0(FP)'
64			echo MOVW '$'$n, R1
65			echo ADDV '$8',R29
66			echo SYSCALL
67			echo ADDV '$-8',R29
68			echo RET
69		case 386
70			echo TEXT $i'(SB)', 1, '$0'
71			echo MOVL '$'$n, AX
72			echo INT '$'64
73			if(~ $i seek || ~ $i nsec) {
74				echo 'CMPL AX,$-1
75				JNE 4(PC)
76				MOVL a+0(FP),CX
77				MOVL AX,0(CX)
78				MOVL AX,4(CX)'
79			}
80			echo RET
81		case amd64
82			if(~ $i seek)
83				echo TEXT _seek'(SB)', 1, '$0'
84			if not
85				echo TEXT $i'(SB)', 1, '$0'
86			#
87			# For architectures which pass the first argument
88			# in a register, if the system call takes no arguments
89			# there will be no 'a0+0(FP)' reserved on the stack.
90			#
91			if(! ~ $i nsec)
92				echo MOVQ RARG, 'a0+0(FP)'
93			echo MOVQ '$'$n, RARG
94			echo SYSCALL
95			echo RET
96		case sparc
97			echo TEXT $i'(SB)', 1, '$0'
98			echo MOVW R7, '0(FP)'
99			echo MOVW '$'$n, R7
100			echo TA R0
101			if(~ $i seek || ~ $i nsec) {
102				echo 'CMP R7,$-1
103				BNE 4(PC)
104				MOVW a+0(FP),R8
105				MOVW R7,0(R8)
106				MOVW R7,4(R8)'
107			}
108			echo RETURN
109		case arm
110			echo TEXT $i'(SB)', 1, '$0'
111			echo MOVW R0, '0(FP)'
112			echo MOVW '$'$n, R0
113			echo SWI 0
114			if(~ $i seek || ~ $i nsec) {
115				echo 'CMP $-1,R0
116				BNE 4(PC)
117				MOVW a+0(FP),R1
118				MOVW R0,0(R1)
119				MOVW R0,4(R1)'
120			}
121			echo RET
122		case power
123			echo TEXT $i'(SB)', 1, '$0'
124			echo MOVW R3, '0(FP)'
125			echo MOVW '$'$n, R3
126			echo SYSCALL
127			if(~ $i seek || ~ $i nsec) {
128				echo 'CMP R3,$-1
129				BNE 4(PC)
130				MOVW a+0(FP),R8
131				MOVW R3,0(R8)
132				MOVW R3,4(R8)'
133			}
134			echo RETURN
135		case power64
136			if(~ $i seek)
137				echo TEXT _seek'(SB)', 1, '$0'
138			if not
139				echo TEXT $i'(SB)', 1, '$0'
140			echo MOVD R3, '0(FP)'
141			echo MOVW '$'$n, R3
142			echo SYSCALL
143			echo RETURN
144		case riscv
145			echo TEXT $i'(SB)', 1, '$0'
146			echo MOVW R8, '0(FP)'
147			echo MOVW '$'$n, R8
148			echo ECALL
149			if(~ $i seek) {
150				echo 'MOVW $-1, R9
151				BNE R8, R9, 4(PC)
152				MOVW a+0(FP),R9
153				MOVW R8,0(R9)
154				MOVW R8,4(R9)'
155			}
156			if(~ $i nsec) {
157				echo 'MOVW a+0(FP),R10
158				MOVW R8,0(R10)
159				MOVW R9,4(R10)'
160			}
161			echo RET
162		case riscv64
163			if(~ $i seek)
164				echo TEXT _seek'(SB)', 1, '$0'
165			if not
166				echo TEXT $i'(SB)', 1, '$0'
167			#
168			# For architectures which pass the first argument
169			# in a register, if the system call takes no arguments
170			# there will be no 'a0+0(FP)' reserved on the stack.
171			#
172			# jc doesn't widen longs to vlongs when pushing them.
173			# so we have to be careful here to only push longs
174			# for first arguments, where appropriate.
175			#
176			switch ($i) {
177			case nsec
178				;
179			case bind chdir exec _exits segbrk open create \
180			    brk_ remove notify pipe seek segdetach segfree \
181			    segflush rendezvous unmount semacquire \
182			    semrelease errstr stat wstat await tsemacquire
183				echo MOV R8, '0(FP)'
184			case *
185				echo MOVW R8, '0(FP)'
186			}
187			echo MOV '$'$n, R8
188			echo ECALL
189			echo RET
190		}} > $i.s
191		$AS $i.s
192	}
193	ar vu /$objtype/lib/libc.a *.$O
194	rm -f *.$O *.s
195
196nuke clean:V:
197	rm -f *.[$OS]
198
199installall:V:
200	for(objtype in $CPUS) mk install
201
202update:V:
203	update $UPDATEFLAGS mkfile sys.h
204