This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Inefficient ia64 system call implementation in glibc


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=1212
   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=b0;;
  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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]