[PATCH] microblaze: fix __syscall_cancel_arch
Luc Michel
luc.michel@amd.com
Fri Oct 17 12:36:26 GMT 2025
On 09:22 Fri 17 Oct , Adhemerval Zanella Netto wrote:
> On 17/10/25 06:27, Luc Michel wrote:
> > The __syscall_cancel_arch function has an epilogue that does not match
> > the prologue. The stack is not used and the return address still lies in
> > r15 when reaching the epilogue. Fix the epilogue by simply returning
> > from the function.
> >
> > Signed-off-by: Luc Michel <luc.michel@amd.com>
>
> LGTM. How did you tested? I tried to come up with an simulated microblaze
> environment, but there is no official qemu support (only qemu-user).
I tested using the following reproducer provided by Gopi (CC'ed) and
modified a bit to track down the issue:
8<-------------------------------------------------------------
#include <thread>
#include <vector>
#include <iostream>
void worker(std::size_t n)
{
unsigned volatile int count = 1 << 31;
std::cout << "hello thread\n";
while (count--);
std::cout << "bye thread\n";
}
int main()
{
std::thread t(worker, 1);
t.join();
return 0;
}
8<-------------------------------------------------------------
The failure was actually reported to me using qemu-user.
I reproduced it like this, building a toolchain using buildroot:
~/work/buildroot/output/host/bin/microblazeel-buildroot-linux-gnu-g++ -static -g3 -o qemu-crash qemu-crash.cc
~/work/build/qemu-debug/qemu-microblazeel -L ~/work/buildroot/output/host/microblazeel-buildroot-linux-gnu/sysroot ./qemu-crash
Without this patch, QEMU execution ends up with a segmentation fault.
With the patch applied it works fine.
Thanks
--
Luc
>
> > ---
> >
> > Hi,
> > This bug was introduced by 89b53077d2a58f00e7debdfe58afabe953dac60d
> > (BZ#12683).
> >
> > https://sourceware.org/bugzilla/show_bug.cgi?id=12683 suggests that the
> > author copied coded generated by GCC. This is probably why the epilogue
> > was wrong.
> >
> > I have yet to create a Bugzilla entry for this. I just requested an
> > accound and waiting for it.
> >
> > Thanks
> >
> > Luc
> >
> > ---
> > sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S | 3 +--
> > 1 file changed, 1 insertion(+), 2 deletions(-)
> >
> > diff --git a/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S b/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S
> > index 38150e6a94..3e8dc96a93 100644
> > --- a/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S
> > +++ b/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S
> > @@ -48,13 +48,12 @@ __syscall_cancel_arch_start:
> >
> > .globl __syscall_cancel_arch_end
> > __syscall_cancel_arch_end:
> >
> > nop
> > - lwi r15,r1,0
> > rtsd r15,8
> > - addik r1,r1,28
> > + nop
> >
> > 1:
> > brlid r15, __syscall_do_cancel
> > nop
> >
>
--
More information about the Libc-alpha
mailing list