diff mbox series

libffi: Fix MIPS r6 support

Message ID 20210827045809.59150-1-yunqiang.su@cipunited.com
State New
Headers show
Series libffi: Fix MIPS r6 support | expand

Commit Message

YunQiang Su Aug. 27, 2021, 4:58 a.m. UTC
for some instructions, MIPS r6 uses different encoding other than
the previous releases.

1. mips/n32.S disable .set mips4: since it casuses old insn encoding
   is used.
   https://github.com/libffi/libffi/pull/396
2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
   different value for r6 and pre-r6.
   https://github.com/libffi/libffi/pull/401

libffi/
	PR libffi/83636
	* src/mips/n32.S: disable .set mips4
	* src/mips/ffi.c: use different JR encoding for r6.
---
 libffi/src/mips/ffi.c | 8 ++++++++
 libffi/src/mips/n32.S | 2 ++
 2 files changed, 10 insertions(+)

Comments

Jeff Law Aug. 27, 2021, 9:28 p.m. UTC | #1
On 8/26/2021 10:58 PM, YunQiang Su wrote:
> for some instructions, MIPS r6 uses different encoding other than
> the previous releases.
>
> 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
>     is used.
>     https://github.com/libffi/libffi/pull/396
> 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
>     different value for r6 and pre-r6.
>     https://github.com/libffi/libffi/pull/401
>
> libffi/
> 	PR libffi/83636
> 	* src/mips/n32.S: disable .set mips4
> 	* src/mips/ffi.c: use different JR encoding for r6.
These should go to the upstream libffi project.  Once accepted there you 
can add them to GCC.

Jeff
Xi Ruoyao Aug. 28, 2021, 7:23 a.m. UTC | #2
On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
> 
> 
> On 8/26/2021 10:58 PM, YunQiang Su wrote:
> > for some instructions, MIPS r6 uses different encoding other than
> > the previous releases.
> > 
> > 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
> >     is used.
> >     https://github.com/libffi/libffi/pull/396
> > 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
> >     different value for r6 and pre-r6.
> >     https://github.com/libffi/libffi/pull/401
> > 
> > libffi/
> >         PR libffi/83636
> >         * src/mips/n32.S: disable .set mips4
> >         * src/mips/ffi.c: use different JR encoding for r6.
> These should go to the upstream libffi project.  Once accepted there
> you 
> can add them to GCC.

Hi Jeff,

The two PRs are already merged, and released since libffi-3.3.0 (now the
upstream latest release is 3.4.2).

I don't have a MIPSr6 so I can't test though.

YunQiang: the commit message should mention the commit SHA in upstream
libffi repo's main branch, instead of a URL to PR.  You can use "git
log" in gcc repo and search for commits for libffi and learn from it.
YunQiang Su Aug. 28, 2021, 12:14 p.m. UTC | #3
Xi Ruoyao via Gcc-patches <gcc-patches@gcc.gnu.org> 于2021年8月28日周六 下午3:25写道:
>
> On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
> >
> >
> > On 8/26/2021 10:58 PM, YunQiang Su wrote:
> > > for some instructions, MIPS r6 uses different encoding other than
> > > the previous releases.
> > >
> > > 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
> > >     is used.
> > >     https://github.com/libffi/libffi/pull/396
> > > 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
> > >     different value for r6 and pre-r6.
> > >     https://github.com/libffi/libffi/pull/401
> > >
> > > libffi/
> > >         PR libffi/83636
> > >         * src/mips/n32.S: disable .set mips4
> > >         * src/mips/ffi.c: use different JR encoding for r6.
> > These should go to the upstream libffi project.  Once accepted there
> > you
> > can add them to GCC.
>
> Hi Jeff,
>
> The two PRs are already merged, and released since libffi-3.3.0 (now the
> upstream latest release is 3.4.2).
>
> I don't have a MIPSr6 so I can't test though.
>

We do have a qemu tarball. Please see:
Debian: http://58.246.137.130:20180/README.txt
Arch: http://58.246.137.130:20180/archlinux/dist/

> YunQiang: the commit message should mention the commit SHA in upstream
> libffi repo's main branch, instead of a URL to PR.  You can use "git
> log" in gcc repo and search for commits for libffi and learn from it.
> --
> Xi Ruoyao <xry111@mengyan1223.wang>
> School of Aerospace Science and Technology, Xidian University
>
Jeff Law Aug. 29, 2021, 9 p.m. UTC | #4
On 8/28/2021 1:23 AM, Xi Ruoyao wrote:
> On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
>>
>> On 8/26/2021 10:58 PM, YunQiang Su wrote:
>>> for some instructions, MIPS r6 uses different encoding other than
>>> the previous releases.
>>>
>>> 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
>>>      is used.
>>>      https://github.com/libffi/libffi/pull/396
>>> 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
>>>      different value for r6 and pre-r6.
>>>      https://github.com/libffi/libffi/pull/401
>>>
>>> libffi/
>>>          PR libffi/83636
>>>          * src/mips/n32.S: disable .set mips4
>>>          * src/mips/ffi.c: use different JR encoding for r6.
>> These should go to the upstream libffi project.  Once accepted there
>> you
>> can add them to GCC.
> Hi Jeff,
>
> The two PRs are already merged, and released since libffi-3.3.0 (now the
> upstream latest release is 3.4.2).
ACK.  Thanks for confirming.  It's always OK to cherrypick/backport from 
libffi back to GCC.

>
> I don't have a MIPSr6 so I can't test though.
Understood.   Me neither, but I really should get a tiny chroot for 
mipsr6 so that my tester can validate it regularly.

Jeff
YunQiang Su Aug. 30, 2021, 8:47 a.m. UTC | #5
在 2021/8/30 5:00, Jeff Law 写道:
> 
> 
> On 8/28/2021 1:23 AM, Xi Ruoyao wrote:
>> On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
>>>
>>> On 8/26/2021 10:58 PM, YunQiang Su wrote:
>>>> for some instructions, MIPS r6 uses different encoding other than
>>>> the previous releases.
>>>>
>>>> 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
>>>>      is used.
>>>>      https://github.com/libffi/libffi/pull/396
>>>> 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
>>>>      different value for r6 and pre-r6.
>>>>      https://github.com/libffi/libffi/pull/401
>>>>
>>>> libffi/
>>>>          PR libffi/83636
>>>>          * src/mips/n32.S: disable .set mips4
>>>>          * src/mips/ffi.c: use different JR encoding for r6.
>>> These should go to the upstream libffi project.  Once accepted there
>>> you
>>> can add them to GCC.
>> Hi Jeff,
>>
>> The two PRs are already merged, and released since libffi-3.3.0 (now the
>> upstream latest release is 3.4.2).
> ACK.  Thanks for confirming.  It's always OK to cherrypick/backport from 
> libffi back to GCC.
> 
>>
>> I don't have a MIPSr6 so I can't test though.
> Understood.   Me neither, but I really should get a tiny chroot for 
> mipsr6 so that my tester can validate it regularly.
> 

We have port Debian to MIPS64r6el.
http://58.246.137.130:20180/tools/tarball/
You can use both buster(Debian 10) or bullseye (Debian 11).

And both qemu-system and qemu-user can work.


> Jeff
> .
Jeff Law Aug. 30, 2021, 1:46 p.m. UTC | #6
On 8/30/2021 2:47 AM, YunQiang Su wrote:
> 在 2021/8/30 5:00, Jeff Law 写道:
>>
>>
>> On 8/28/2021 1:23 AM, Xi Ruoyao wrote:
>>> On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
>>>>
>>>> On 8/26/2021 10:58 PM, YunQiang Su wrote:
>>>>> for some instructions, MIPS r6 uses different encoding other than
>>>>> the previous releases.
>>>>>
>>>>> 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
>>>>>      is used.
>>>>>      https://github.com/libffi/libffi/pull/396
>>>>> 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
>>>>>      different value for r6 and pre-r6.
>>>>>      https://github.com/libffi/libffi/pull/401
>>>>>
>>>>> libffi/
>>>>>          PR libffi/83636
>>>>>          * src/mips/n32.S: disable .set mips4
>>>>>          * src/mips/ffi.c: use different JR encoding for r6.
>>>> These should go to the upstream libffi project.  Once accepted there
>>>> you
>>>> can add them to GCC.
>>> Hi Jeff,
>>>
>>> The two PRs are already merged, and released since libffi-3.3.0 (now 
>>> the
>>> upstream latest release is 3.4.2).
>> ACK.  Thanks for confirming.  It's always OK to cherrypick/backport 
>> from libffi back to GCC.
>>
>>>
>>> I don't have a MIPSr6 so I can't test though.
>> Understood.   Me neither, but I really should get a tiny chroot for 
>> mipsr6 so that my tester can validate it regularly.
>>
>
> We have port Debian to MIPS64r6el.
> http://58.246.137.130:20180/tools/tarball/
> You can use both buster(Debian 10) or bullseye (Debian 11).
>
> And both qemu-system and qemu-user can work.
Understood.  I need the minimal chroot to compress down under 100M to 
make gitlab happy (that's where my scripts & jenkins system expect to 
find them).  My scripts to build the chroots also ensure a consistent 
set of packages & version #s across the different systems being 
tested.   I've just never gotten around to building one for mips64r6.  I 
could probably take yours trim out unnecessary stuff and use it for 
now.  Getting a bootstrap test on the target weekly is definitely helpful.

jeff
YunQiang Su Aug. 31, 2021, 2:46 a.m. UTC | #7
Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> 于2021年8月30日周一 下午9:48写道:
>
>
>
> On 8/30/2021 2:47 AM, YunQiang Su wrote:
> > 在 2021/8/30 5:00, Jeff Law 写道:
> >>
> >>
> >> On 8/28/2021 1:23 AM, Xi Ruoyao wrote:
> >>> On Fri, 2021-08-27 at 15:28 -0600, Jeff Law via Gcc-patches wrote:
> >>>>
> >>>> On 8/26/2021 10:58 PM, YunQiang Su wrote:
> >>>>> for some instructions, MIPS r6 uses different encoding other than
> >>>>> the previous releases.
> >>>>>
> >>>>> 1. mips/n32.S disable .set mips4: since it casuses old insn encoding
> >>>>>      is used.
> >>>>>      https://github.com/libffi/libffi/pull/396
> >>>>> 2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
> >>>>>      different value for r6 and pre-r6.
> >>>>>      https://github.com/libffi/libffi/pull/401
> >>>>>
> >>>>> libffi/
> >>>>>          PR libffi/83636
> >>>>>          * src/mips/n32.S: disable .set mips4
> >>>>>          * src/mips/ffi.c: use different JR encoding for r6.
> >>>> These should go to the upstream libffi project.  Once accepted there
> >>>> you
> >>>> can add them to GCC.
> >>> Hi Jeff,
> >>>
> >>> The two PRs are already merged, and released since libffi-3.3.0 (now
> >>> the
> >>> upstream latest release is 3.4.2).
> >> ACK.  Thanks for confirming.  It's always OK to cherrypick/backport
> >> from libffi back to GCC.
> >>
> >>>
> >>> I don't have a MIPSr6 so I can't test though.
> >> Understood.   Me neither, but I really should get a tiny chroot for
> >> mipsr6 so that my tester can validate it regularly.
> >>
> >
> > We have port Debian to MIPS64r6el.
> > http://58.246.137.130:20180/tools/tarball/
> > You can use both buster(Debian 10) or bullseye (Debian 11).
> >
> > And both qemu-system and qemu-user can work.
> Understood.  I need the minimal chroot to compress down under 100M to

A minimal tarball is ready now with size about 87M.

> make gitlab happy (that's where my scripts & jenkins system expect to
> find them).  My scripts to build the chroots also ensure a consistent
> set of packages & version #s across the different systems being
> tested.   I've just never gotten around to building one for mips64r6.  I
> could probably take yours trim out unnecessary stuff and use it for
> now.  Getting a bootstrap test on the target weekly is definitely helpful.
>

That's great.
Since the minimal rootfs lacks of lots of tools, and
if you need some tools, you can just apt install them,then.

> jeff
diff mbox series

Patch

diff --git a/libffi/src/mips/ffi.c b/libffi/src/mips/ffi.c
index 5d0dd70cb..ecd783a56 100644
--- a/libffi/src/mips/ffi.c
+++ b/libffi/src/mips/ffi.c
@@ -698,7 +698,11 @@  ffi_prep_closure_loc (ffi_closure *closure,
   /* lui  $12,high(codeloc) */
   tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16);
   /* jr   $25          */
+#if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
   tramp[3] = 0x03200008;
+#else
+  tramp[3] = 0x03200009;
+#endif
   /* ori  $12,low(codeloc)  */
   tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff);
 #else
@@ -726,7 +730,11 @@  ffi_prep_closure_loc (ffi_closure *closure,
   /* ori  $25,low(fn)  */
   tramp[10] = 0x37390000 | ((unsigned long)fn  & 0xffff);
   /* jr   $25          */
+#if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
   tramp[11] = 0x03200008;
+#else
+  tramp[11] = 0x03200009;
+#endif
   /* ori  $12,low(codeloc)  */
   tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff);
 
diff --git a/libffi/src/mips/n32.S b/libffi/src/mips/n32.S
index c6985d30a..06e6c4607 100644
--- a/libffi/src/mips/n32.S
+++ b/libffi/src/mips/n32.S
@@ -43,7 +43,9 @@ 
 #ifdef __GNUC__
 	.abicalls
 #endif
+#if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
 	.set mips4
+#endif
 	.text
 	.align	2
 	.globl	ffi_call_N32