1 # Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>
2 # This file is part of the Linux-8086 C library and is distributed
3 # under the GNU Library General Public License.
5 # This script generates the 'simple' system calls.
7 # Each call is put into it's own object file, if the semantics of the
8 # call are not correct UNIX then the 4th field in the dat file has a
9 # marker and the function is generated with a __ prefix.
12 # Different levels of squeeze
13 # 0 = each is complete
14 # 1 = Short codes calling common function
18 rm -f syscall.c syscall.mak call_tab.v defn_tab.v syscall.dat
20 if [ -r ${ELKSSRC}/arch/i86/kernel/syscall.dat \
21 -a ! -r ${TOPDIR}/libc/kinclude/Used ]
23 then echo Using syscalls from ${ELKSSRC}
24 cp -p ${ELKSSRC}/arch/i86/kernel/syscall.dat syscall.dat
25 else echo Using syscalls from syscall.dev86
26 cp -p syscall.dev86 syscall.dat
29 tr '[A-Z]' '[a-z]' < syscall.dat | \
30 awk -v COMPACT=$COMPACT 'BEGIN{
31 print "# Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>" > "syscall.mak";
32 print "# This file is part of the Linux-8086 C library and is distributed" > "syscall.mak";
33 print "# under the GNU Library General Public License." > "syscall.mak";
34 print "# " > "syscall.mak";
35 print "# This file is automatically generated\n" > "syscall.mak"
37 print "/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>";
38 print " * This file is part of the Linux-8086 C library and is distributed";
39 print " * under the GNU Library General Public License.";
41 print " * This file is automatically generated */\n"
44 print "/* Standard start */\n\n"
45 printf("#ifndef __MSDOS__\n");
46 printf("#ifdef __AS386_16__\n");
50 printf("#endasm\n\n");
53 obj=obj "__syscall.o __syscall4.o ";
54 print "/* Shared system call code */\n"
55 printf("#ifdef L___syscall\n", funcname);
57 printf("#if __FIRST_ARG_IN_AX__\n");
59 printf("export sys_call3\nsys_call3:\n");
60 printf(" mov bx,sp\n");
61 printf(" mov cx,[bx+2]\n");
62 printf(" mov bx,[bx+4]\n");
63 # ax=arg1 bx=arg3 cx=arg2 dx=arg0
64 printf(" xchg ax,bx\n");
65 # ax=arg3 bx=arg1 cx=arg2 dx=arg0
66 printf(" xchg ax,dx\n");
67 # ax=arg0 bx=arg1 cx=arg2 dx=arg3
68 printf(" jmp sys_call0\n\n");
70 printf("export sys_call2\nsys_call2:\n");
71 printf(" mov bx,sp\n");
72 printf(" mov cx,[bx+2]\n");
73 printf(" mov bx,ax\n");
74 printf(" mov ax,dx\n");
75 printf(" jmp sys_call0\n\n");
77 printf("export sys_call1\nsys_call1:\n");
78 printf(" mov bx,ax\n");
79 printf(" mov ax,dx\n");
81 printf("export sys_call3\nsys_call3:\n");
82 printf(" mov bx,sp\n");
83 printf(" mov dx,[bx+6]\n");
84 printf(" mov cx,[bx+4]\n");
85 printf(" mov bx,[bx+2]\n");
86 printf(" jmp sys_call0\n\n");
88 printf("export sys_call2\nsys_call2:\n");
89 printf(" mov bx,sp\n");
90 printf(" mov cx,[bx+4]\n");
91 printf(" mov bx,[bx+2]\n");
92 printf(" jmp sys_call0\n\n");
94 printf("export sys_call1\nsys_call1:\n");
95 printf(" mov bx,sp\n");
96 printf(" mov bx,[bx+2]\n");
99 printf("export sys_call0\nsys_call0:\n");
100 printf(" int $80\n");
101 printf(" test ax,ax\n");
102 printf(" jge syscall_ok\n");
104 printf(" mov [_errno],ax\n");
105 printf(" mov ax,#-1\n");
106 printf("syscall_ok:\n");
109 printf("#endif\n\n");
111 print "/* Shared system call code, syscalls with 4/5 args */\n"
112 printf("#ifdef L___syscall4\n", funcname);
114 printf("#if __FIRST_ARG_IN_AX__\n");
116 printf("export sys_call4\nsys_call4:\n");
117 printf("export sys_call5\nsys_call5:\n");
118 printf(" mov bx,sp\n");
119 printf(" push si\n");
120 printf(" mov si,[bx+8]\n");
121 printf(" push di\n");
122 printf(" mov di,[bx+6]\n");
123 printf(" mov cx,[bx+2]\n");
124 printf(" mov bx,[bx+4]\n");
125 # ax=arg1 bx=arg3 cx=arg2 dx=arg0
126 printf(" xchg ax,bx\n");
127 # ax=arg3 bx=arg1 cx=arg2 dx=arg0
128 printf(" xchg ax,dx\n");
129 # ax=arg0 bx=arg1 cx=arg2 dx=arg3
131 printf("export sys_call4\nsys_call4:\n");
132 printf("export sys_call5\nsys_call5:\n");
133 printf(" mov bx,sp\n");
134 printf(" push si\n");
135 printf(" mov si,[bx+10]\n");
136 printf(" push di\n");
137 printf(" mov di,[bx+8]\n");
138 printf(" mov dx,[bx+6]\n");
139 printf(" mov cx,[bx+4]\n");
140 printf(" mov bx,[bx+2]\n");
141 printf("#endif\n\n");
143 printf(" int $80\n");
146 printf(" test ax,ax\n");
147 printf(" jge syscall_ok\n");
149 printf(" mov [_errno],ax\n");
150 printf(" mov ax,#-1\n");
151 printf("syscall_ok:\n");
154 printf("#endif\n\n");
161 if( !(callno in calltab) )
162 callwas[callno] = " /* " $1 " */";
164 if( $3 == "x" || $3 == "" ) next;
165 else if( $4 == "@" || $4 == "-" ) next;
166 else if( $4 == "*" ) funcname="__" $1;
169 if( callno > max_call ) max_call = callno;
171 calltab[callno] = $1;
173 if( length(obj) > 60 )
175 printf("%s\t\\\n", obj) > "syscall.mak";
178 obj=obj funcname ".o ";
180 printf "/* CALL %s */\n\n", $0;
182 printf("#ifdef L_%s\n", funcname);
183 printf("#asm\n", funcname);
184 printf("export _%s\n", funcname);
185 printf("_%s:\n", funcname);
187 # Inline assembler max to 5 args (10 bytes)
188 if( $3 != 4 && $3 != 5 && ( COMPACT || $3 > 5 ))
192 printf(" mov ax,#%d\n", callno);
196 printf("#if __FIRST_ARG_IN_AX__\n");
197 printf(" mov dx,#%d\n", callno);
199 printf(" mov ax,#%d\n", callno);
202 printf(" br sys_call%d\n", $3);
207 printf("#if __FIRST_ARG_IN_AX__\n");
209 printf(" mov bx,sp\n");
211 printf(" push si\n");
213 printf(" mov si,[bx+8]\n");
215 printf(" push di\n");
217 printf(" mov di,[bx+6]\n");
219 printf(" mov dx,[bx+4]\n");
221 printf(" mov cx,[bx+2]\n");
223 printf(" mov bx,ax\n");
227 printf(" mov bx,sp\n");
229 printf(" push si\n");
231 printf(" mov si,[bx+10]\n");
233 printf(" push di\n");
235 printf(" mov di,[bx+8]\n");
237 printf(" mov dx,[bx+6]\n");
239 printf(" mov cx,[bx+4]\n");
241 printf(" mov bx,[bx+2]\n");
245 printf(" mov ax,#%d\n", callno);
247 printf(" int $80\n");
254 printf(" test ax,ax\n");
255 printf(" jl syscall_err\n");
257 printf("syscall_err:\n");
259 printf(" mov [_errno],ax\n");
260 printf(" mov ax,#-1\n");
264 printf("#endif\n\n");
268 for(i=0; i<=max_call; i++)
271 printf("#ifndef sys_%s\n", calltab[i]) > "defn_tab.v";
272 printf("#define sys_%s sys_enosys\n", calltab[i]) > "defn_tab.v";
273 printf("#endif\n\n") > "defn_tab.v";
276 for(i=0; i<=max_call; i++)
278 printf("/* %3d */ sys_%s,\n", i, calltab[i]) > "call_tab.v";
280 printf("/* %3d */ sys_enosys,%s\n", i, callwas[i]) > "call_tab.v";
282 printf("#endif /* __AS386_16__ */\n\n");
283 printf("#endif /* __MSDOS__ */\n\n");
284 printf("%s\n", obj) > "syscall.mak";
285 printf "\n" > "syscall.mak";
289 cat >> syscall.mak <<\!
294 $(LIBC)($(OBJ)): syscall.dat
295 $(CC) $(CFLAGS) -DL_$* syscall.c -c -o $*.o
296 $(AR) $(ARFLAGS) $@ $*.o