[parisc-linux] problem with our syscall() implementation

Randolph Chung Randolph Chung <randolph@tausq.org>
Sun, 12 Jan 2003 00:57:50 -0800


glibc provides an interface to call a system call from userspace
directly using the syscall() function.  The glibc exported interface for
syscall() is variadic (int syscall(int sysno, ...))

for hppa, the implementation has this prototype:

int syscall (int sysnum, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5)

one problem with this is that one cannot reliably pass 64-bit values
into the kernel. for example, if i want to call a syscall with this
signature:

sys_foo(uint64_t x, int y, int z)
(let's say sys_foo has syscall number 300)

the x argument does not end up in arg0... instead it seems to be spread
across arg1 and arg2 (because of register alignment, i suppose)

is there any way to write syscall() so that we can pass 64-bit values
reliably?

randolph
-- 
Randolph Chung
Debian GNU/Linux Developer, hppa/ia64 ports
http://www.tausq.org/