Inefficient ia64 system call implementation in glibc

H. J. Lu
2003-09-19T16:32:18Z

The inline ia64 system call assumes all values passed to kernel are
signed 64bit. It does sign extension if the incoming arg is not signed
64bit. In case of fxstat.c:

int
__fxstat (int vers, int fd, struct stat *buf)
{
return INLINE_SYSCALL (fstat, 2, fd, CHECK_1 (buf));
}

it leads to

0000000000000000 <__fxstat>:
0: 00 20 39 0c 80 05 [MII] alloc r36=ar.pfs,14,6,0
6: f0 e0 01 12 48 a0 mov r15\x1212
c: 04 08 00 84 mov r37=r1
10: 01 38 01 44 00 21 [MII] mov r39=r34
16: 60 02 84 2c 00 60 sxt4 r38=r33
^^^^^^^^^^^^^
1c: 04 00 c4 00 mov r35°;;
20: 0a 00 00 00 00 02 [MMI] break.m 0x100000;;
26: 10 02 20 00 42 e0 mov r33=r8

"sxt4 r38=r33" is not necessary at all since kernel will never use
the uppper 4 bytes with

asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf)

The basically problem is glibc doesn't store information about what
the kernel interface is so that it can't efficiently set up parameters
for system calls. Is there a way to improve the situation?

H.J.