RE: [RFC PATCH v1 3/6] tools/nolibc: i386: Implement syscall with 6 arguments

From: David Laight
Date: Sun Mar 20 2022 - 14:22:52 EST


From: Ammar Faizi
> Sent: 20 March 2022 15:04
> On 3/20/22 8:10 PM, David Laight wrote:
> > From: Ammar Faizi
> >> Sent: 20 March 2022 09:38
> >>
> >> In i386, the 6th argument of syscall goes in %ebp. However, both Clang
> >> and GCC cannot use %ebp in the clobber list and in the "r" constraint
> >> without using -fomit-frame-pointer. To make it always available for any
> >> kind of compilation, the below workaround is implemented.
> >>
> >> For clang (the Assembly statement can't clobber %ebp):
> >> 1) Save the %ebp value to the redzone area -4(%esp).
> >
> > i386 doesn't have a redzone.
> > If you get a signal it will trash -4(%sp)
>
> OK, I missed that one. Thanks for reviewing this.
>
...
> >
> > One possibility might be to do:
> > push arg6
> > push %ebp
> > mov %ebp, 4(%sp)
>
> Did you mean `mov 4(%esp), %ebp`?
>
> > int 0x80
> > pop %ebp
> > add %esp,4
>
> I think your solution is better than the xchg approach (with the 3rd line
> fixed). Will take this in for the next version.

It has to be said that although I've been writing x86 asm
for 40 years (and others for longer) I can never actually
remember the exact syntax or order of the operands!
Probably because it is randomly different between assemblers.
You want the 'memory read' instruction: 8b /r.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)