lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 13 Oct 2021 05:01:32 +0200
From:   Willy Tarreau <w@....eu>
To:     Ammar Faizi <ammar.faizi@...dents.amikom.ac.id>
Cc:     Paul Walmsley <paul.walmsley@...ive.com>,
        Palmer Dabbelt <palmer@...belt.com>,
        Albert Ou <aou@...s.berkeley.edu>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        Andy Lutomirski <luto@...nel.org>,
        Thomas Gleixner <tglx@...utronix.de>,
        Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
        x86@...nel.org, "H. Peter Anvin" <hpa@...or.com>
Subject: Re: [PATCH] tools/nolibc: x86: Remove `r8`, `r9` and `r10` from the
 clobber list

On Wed, Oct 13, 2021 at 05:23:11AM +0700, Ammar Faizi wrote:
> > > A.2.1 Calling Conventions"
> > >
> > > and that section explains which regs go where.
> >
> > Ok, that didn't point to the exact answer - I realize now. I believe
> > what you're looking for in that doc is "Figure 3.4: Register Usage"
> > which has a column "callee saved" and says that the syscall arg
> > registers are all not callee-saved.
> 
> No, you were right. A.2.1 was the part we are looking for, thanks for
> pointed that. That's the exact answer.

Yes I agree, that's exactly it, thank you Boris!

> According to x86-64 ABI about syscall section A.2 AMD64 Linux Kernel
> Conventions, A.2.1 Calling Conventions [1]:
> 
> 1) User-level applications use as integer registers for passing the
>    sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9. The kernel interface
>    uses %rdi, %rsi, %rdx, %r10, %r8 and %r9.
> 
> 2) A system-call is done via the syscall instruction. The kernel
>    destroys registers %rcx and %r11.
> 
> 3) The number of the syscall has to be passed in register %rax.
> 
> 4) System-calls are limited to six arguments, no argument is passed
>    directly on the stack.
> 
> 5) Returning from the syscall, register %rax contains the result of
>    the system-call. A value in the range between -4095 and -1
>    indicates an error, it is -errno.
> 
> 6) Only values of class INTEGER or class MEMORY are passed to the
>    kernel.
> 
> From (2), (5) and (6), we can conclude that Linux x86-64 syscall only
> clobbers rax, rcx and r11 (and "memory").
> 
>   - rax for the return value.
>   - rcx to save the return address.
>   - r11 to save the rflags.
> 
> Other registers are preserved. Right?

I totally agree, and this doc is perfectly clear on this. I think it
would be worth updating the comments in calling.h to reference this
document and remind these rules, given that they're not trivial to
figure from the code itself.

Willy

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ