[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: jit_stxi() is broken on PowerPC 64
From: |
Paulo César Pereira de Andrade |
Subject: |
Re: jit_stxi() is broken on PowerPC 64 |
Date: |
Sat, 14 May 2022 18:04:47 -0300 |
Em sáb., 14 de mai. de 2022 às 17:54, Paulo César Pereira de Andrade
<paulo.cesar.pereira.de.andrade@gmail.com> escreveu:
>
> Em sáb., 14 de mai. de 2022 às 08:44, Paul Cercueil
> <paul@crapouillou.net> escreveu:
> >
> > Hi,
>
> Hi,
>
> > I'm not exactly sure what's happening, but I can get Lightning to
> > generate invalid code using jit_stxi() on PPC64.
> >
> > Here's a simple program to reproduce the issue:
> >
> > #include <lightning.h>
> >
> > int main(int argc, char **argv)
> > {
> > jit_state_t *_jit;
> >
> > init_jit(argv[0]);
> > _jit = jit_new_state();
> > jit_prolog();
> >
> > jit_stxi(0x31a, JIT_R1, JIT_V2);
> >
> > jit_ret();
> > jit_epilog();
> >
> > jit_emit();
> > jit_disassemble();
> >
> > jit_clear_state();
> > jit_destroy_state();
> > finish_jit();
> >
> > return 0;
> > }
> >
> >
> > The disassembler will print the following:
> > 0x3fff8b230000 mflr r0
> > 0x3fff8b230004 std r0,16(r1)
> > 0x3fff8b230008 std r31,-8(r1)
> > 0x3fff8b23000c mr r31,r1
> > 0x3fff8b230010 stdu r1,-256(r1)
> > 0x3fff8b230014 .long 0xfb3d031a
> > 0x3fff8b230018 addi r1,r1,256
> > 0x3fff8b23001c ld r0,16(r1)
> > 0x3fff8b230020 mtlr r0
> > 0x3fff8b230024 ld r31,-8(r1)
> > 0x3fff8b230028 blr
> >
> >
> > Of course this program won't execute properly (since the registers
> > aren't initialized), but in a real program, the ".long 0xfb3d031a" will
> > result in an "illegal instruction" error.
>
> Is this in an emulator or some other system? What I see is:
>
> 0x3fffb7f10024: mr r31,r1
> 0x3fffb7f10028: stdu r1,-272(r1)
> => 0x3fffb7f1002c: stq r24,792(r29)
> 0x3fffb7f10030: addi r1,r1,272
>
> (gdb) p/x *(int*)0x3fffb7f1002c
> $1 = 0xfb3d031a
>
> so, it should not be an invalid instruction. The ending "31a" appears to
> match the requested offset as well.
>
> > Cheers,
> > -Paul
You might be getting some unaligned address fault:
(gdb) p 0x31a & 7
$3 = 2
Thanks,
Paulo