![]() |
|
Message-ID: <CAGWvny=ha0uJpQthRrZNPhizzyyr8DcBqEKVc-EJX8qGaEGALQ@mail.gmail.com>
Date: Wed, 6 Aug 2025 11:23:50 -0400
From: David Edelsohn <dje.gcc@...il.com>
To: musl@...ts.openwall.com
Subject: Re: ctr registry after syscall on powerpc
On Wed, Aug 6, 2025 at 11:07 AM Sertonix <sertonix@...teo.net> wrote:
> (Sorry for the noise, I don't know any better place to ask)
>
> With GCC 15 I get a compiled musl libc that stores a value in the ctr
> registry, doing a syscall which changes the ctr registry and then
> reading back garbage data when trying to read the original value. I
> unfortunatly couldn't find any information do determine if this is an
> issue in musl, gcc or the kernel.
>
> The relevant code from src/malloc/mallocng/malloc.c:
>
> size_t pagesize = PGSZ; // stored into ctr registry
> ...
> ctx.brk = brk(0); // mess up ctr registry
> ...
> ctx.brk += -ctx.brk & (pagesize-1); // try to read back ctr
> registry
>
> When I mark ctr as clobber in __syscall1 I don't see this issue. Is
> that a correct fix?
>
The CTR register is volatile in the ELFv2 (and other) PowerPC ABIs, and
that behavior is not changed by the Linux kernel system call ABI. It's
unusual that GCC is allocating / spilling a value to CTR and that it is
assuming the register is valid across a call. There must be more that is
affecting the dataflow analysis and causing this strange behavior.
I would open a GCC bug. Please include details about exactly which GCC
release and vendor build is being used, and the pre-processed source code.
Thanks, David
Content of type "text/html" skipped
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.