+++ /dev/null
-#
-# socketcall.S
-#
-# Socketcalls use the following convention:
-# %eax = __NR_socketcall
-# %ebx = socketcall number
-# %ecx = pointer to arguments (up to 6)
-#
-
-#include <asm/unistd.h>
-
-#ifdef __i386__
-
- .text
- .align 4
- .globl __socketcall_common
- .type __socketcall_common, @function
-
-__socketcall_common:
- xchgl %ebx,(%esp) # The stub passes the socketcall # on stack
-
-#ifdef _REGPARM
- pushl 16(%esp) # Arg 6
- pushl 16(%esp) # Arg 5
- pushl 16(%esp) # Arg 4
- pushl %ecx
- pushl %edx
- pushl %eax
- movl %esp,%ecx
-#else
- leal 8(%esp),%ecx # Arguments already contiguous on-stack
-#endif
-
- movl $__NR_socketcall,%eax
- call *__syscall_entry
-
-#ifdef _REGPARM
- addl $6*4, %esp
-#endif
-
- cmpl $-4095,%eax # Error return?
-
- popl %ebx
-
- jb 1f
-
- negl %eax
- movl %eax,errno
- orl $-1,%eax # Return -1
-1:
- ret
-
- .size __socketcall_common,.-__socketcall_common
-
-#endif
$nargs = $i;
print " \\\n\t${name}.o";
- if ( $arch eq 'i386' ) {
- open(OUT, "> ${outputdir}/${name}.S")
- or die "$0: Cannot open ${outputdir}/${name}.S\n";
+ open(OUT, "> ${outputdir}/${name}.c")
+ or die "$0: Cannot open ${outputdir}/${name}.c\n";
- print OUT "#include <sys/socketcalls.h>\n";
- print OUT "\n";
- print OUT "\t.text\n";
- print OUT "\t.align 4\n";
- print OUT "\t.globl ${name}\n";
- print OUT "\t.type ${name},\@function\n";
- print OUT "${name}:\n";
- print OUT "\tpushl \$SYS_\U${name}\n";
- print OUT "\tjmp __socketcall_common\n";
- print OUT "\t.size ${name},.-${name}\n";
- close(OUT);
- } else {
- open(OUT, "> ${outputdir}/${name}.c")
- or die "$0: Cannot open ${outputdir}/${name}.c\n";
-
- print OUT "#include \"socketcommon.h\"\n";
- print OUT "\n";
- print OUT "#if _KLIBC_SYS_SOCKETCALL || !defined(__NR_${name})\n\n";
+ print OUT "#include \"socketcommon.h\"\n";
+ print OUT "\n";
+ print OUT "#if _KLIBC_SYS_SOCKETCALL || !defined(__NR_${name})\n\n";
- print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
+ print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
- print OUT "$type $name (", join(', ', @cargs), ")\n";
- print OUT "{\n";
- print OUT " unsigned long args[$nargs];\n";
- for ( $i = 0 ; $i < $nargs ; $i++ ) {
- print OUT " args[$i] = (unsigned long)a$i;\n";
- }
- print OUT " return ($type) __socketcall(SYS_\U${name}\E, args);\n";
- print OUT "}\n\n";
+ print OUT "$type $name (", join(', ', @cargs), ")\n";
+ print OUT "{\n";
+ print OUT " unsigned long args[$nargs];\n";
+ for ( $i = 0 ; $i < $nargs ; $i++ ) {
+ print OUT " args[$i] = (unsigned long)a$i;\n";
+ }
+ print OUT " return ($type) __socketcall(SYS_\U${name}\E, args);\n";
+ print OUT "}\n\n";
- print OUT "#endif\n";
+ print OUT "#endif\n";
- close(OUT);
- }
+ close(OUT);
} else {
die "$file:$.: Could not parse input\n";
}