Re: Syscall changes registers beyond %eax, on linux-i386

From: Brian Gerst (
Date: Thu Sep 19 2002 - 13:04:43 EST

Petr Vandrovec wrote:
> On 19 Sep 02 at 13:22, Richard B. Johnson wrote:
>>>>>A short snippet of sys_poll, with irrelavant data removed.
>>>>>sys_poll(struct pollfd *ufds, .. , ..) {
>>>>> ...
>>>>> ufds++;
>>>>> ...
>>Well which one? Here is an ioctl(). It certainly modifies one
>>of its parameter values.
> poll(), as was already noted. Program below should
> print same value for B= and F=, but it reports f + 8*c instead
> (where c = number of filedescriptors passed to poll).
> And you must call it from assembly, as your calls to getpid() or
> ioctl() (or poll()) are wrapped in libc - and glibc's code begins with
> push %ebx because of %ebx is used by -fPIC code.
> It is questinable whether we should try to not modify parameters
> passed into functions. It is definitely nice behavior, but I think
> that we should only guarantee that syscalls do not modify unused
> registers.
> Petr Vandrovec

Now that I've thought about it more, I think the best solution is to go
through all the syscalls (a big job, I know), and declare the parameters
as const, so that gcc knows it can't modify them, and will throw a
warning if we try.

				Brian Gerst

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to More majordomo info at Please read the FAQ at

This archive was generated by hypermail 2b29 : Mon Sep 23 2002 - 22:00:27 EST