Messages in this thread | | | Date | Thu, 19 Sep 2002 14:04:43 -0400 | From | Brian Gerst <> | Subject | Re: Syscall changes registers beyond %eax, on linux-i386 |
| |
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 > vandrove@vc.cvut.cz
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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |