Messages in this thread |  | | From | David Laight <> | Subject | RE: [RFC PATCH v1 3/6] tools/nolibc: i386: Implement syscall with 6 arguments | Date | Sun, 20 Mar 2022 18:22:35 +0000 |
| |
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)
|  |