* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libc / syscall / mksyscall
blob190554c53dd3744cdcc861019b27325e9dc2da44
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
16 COMPACT=1
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.";
40    print " * ";
41    print " * This file is automatically generated */\n"
42    obj="OBJ=";
44    print "/* Standard start */\n\n"
45    printf("#ifndef __MSDOS__\n");
46    printf("#ifdef __AS386_16__\n");
47    printf("#asm\n");
48    printf("  .text\n");
49    printf("  .even\n");
50    printf("#endasm\n\n");
52    {
53       obj=obj "__syscall.o __syscall4.o ";
54       print "/* Shared system call code */\n"
55       printf("#ifdef L___syscall\n", funcname);
56       printf("#asm\n");
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");
80       printf("#else\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");
97       printf("#endif\n\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");
103       printf("  neg   ax\n");
104       printf("  mov   [_errno],ax\n");
105       printf("  mov   ax,#-1\n");
106       printf("syscall_ok:\n");
107       printf("  ret\n");
108       printf("#endasm\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);
113       printf("#asm\n");
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
130       printf("#else\n");
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");
144       printf("  pop   di\n");
145       printf("  pop   si\n");
146       printf("  test  ax,ax\n");
147       printf("  jge  syscall_ok\n");
148       printf("  neg   ax\n");
149       printf("  mov   [_errno],ax\n");
150       printf("  mov   ax,#-1\n");
151       printf("syscall_ok:\n");
152       printf("  ret\n");
153       printf("#endasm\n");
154       printf("#endif\n\n");
155    }
157 /^[      ]*#/ { next; }
158 /^[      ]*$/ { next; }
160    callno = 0+$2;
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;
167    else                        funcname=$1;
169    if( callno > max_call ) max_call = callno;
171    calltab[callno] = $1;
173    if( length(obj) > 60 )
174    {
175       printf("%s\t\\\n", obj) > "syscall.mak";
176       obj="    ";
177    }
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 ))
189    {
190       if( $3 == 0 )
191       {
192          printf("  mov   ax,#%d\n", callno);
193       }
194       else
195       {
196          printf("#if __FIRST_ARG_IN_AX__\n");
197          printf("  mov   dx,#%d\n", callno);
198          printf("#else\n");
199          printf("  mov   ax,#%d\n", callno);
200          printf("#endif\n");
201       }
202       printf("  br    sys_call%d\n", $3);
203    }
204    else
205    {
206       if( $3 >= 1 )
207          printf("#if __FIRST_ARG_IN_AX__\n");
208       if( $3 >= 2 )
209          printf("  mov   bx,sp\n");
210       if( $3 >= 5 )
211          printf("  push  si\n");
212       if( $3 >= 5 )
213          printf("  mov   si,[bx+8]\n");
214       if( $3 >= 4 )
215          printf("  push  di\n");
216       if( $3 >= 4 )
217          printf("  mov   di,[bx+6]\n");
218       if( $3 >= 3 )
219          printf("  mov   dx,[bx+4]\n");
220       if( $3 >= 2 )
221          printf("  mov   cx,[bx+2]\n");
222       if( $3 >= 1 )
223          printf("  mov   bx,ax\n");
224       if( $3 >= 1 )
225          printf("#else\n");
226       if( $3 >= 1 )
227          printf("  mov   bx,sp\n");
228       if( $3 >= 5 )
229          printf("  push  si\n");
230       if( $3 >= 5 )
231          printf("  mov   si,[bx+10]\n");
232       if( $3 >= 4 )
233          printf("  push  di\n");
234       if( $3 >= 4 )
235          printf("  mov   di,[bx+8]\n");
236       if( $3 >= 3 )
237          printf("  mov   dx,[bx+6]\n");
238       if( $3 >= 2 )
239          printf("  mov   cx,[bx+4]\n");
240       if( $3 >= 1 )
241          printf("  mov   bx,[bx+2]\n");
242       if( $3 >= 1 )
243          printf("#endif\n");
245          printf("  mov   ax,#%d\n", callno);
247          printf("  int   $80\n");
249       if( $3 >= 4 )
250          printf("  pop   di\n");
251       if( $3 >= 5 )
252          printf("  pop   si\n");
254          printf("  test  ax,ax\n");
255          printf("  jl   syscall_err\n");
256          printf("  ret\n");
257          printf("syscall_err:\n");
258          printf("  neg   ax\n");
259          printf("  mov   [_errno],ax\n");
260          printf("  mov   ax,#-1\n");
261          printf("  ret\n");
262    }
263    printf("#endasm\n");
264    printf("#endif\n\n");
266 END{
268    for(i=0; i<=max_call; i++)
269       if( i in calltab )
270       {
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";
274       }
276    for(i=0; i<=max_call; i++)
277       if( i in calltab )
278          printf("/* %3d */  sys_%s,\n", i, calltab[i]) > "call_tab.v";
279       else
280          printf("/* %3d */  sys_enosys,%s\n", i, callwas[i]) > "call_tab.v";
281    
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";
287 }'  > syscall.c
289 cat >> syscall.mak <<\!
291 all: $(LIBC)($(OBJ))
292         @$(RM) $(OBJ)
294 $(LIBC)($(OBJ)): syscall.dat
295         $(CC) $(CFLAGS) -DL_$* syscall.c -c -o $*.o
296         $(AR) $(ARFLAGS) $@ $*.o
299 exit $?