From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8269 Path: news.gmane.org!not-for-mail From: Khem Raj Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH v2] Add PowerPC soft-float support Date: Thu, 6 Aug 2015 18:55:06 -0700 Message-ID: References: <1436526171-32110-1-git-send-email-nbd@openwrt.org> <20150806224749.GA32423@port70.net> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Trace: ger.gmane.org 1438912551 11126 80.91.229.3 (7 Aug 2015 01:55:51 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 7 Aug 2015 01:55:51 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-8282-gllmg-musl=m.gmane.org@lists.openwall.com Fri Aug 07 03:55:50 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1ZNWsv-00062s-Sr for gllmg-musl@m.gmane.org; Fri, 07 Aug 2015 03:55:50 +0200 Original-Received: (qmail 1349 invoked by uid 550); 7 Aug 2015 01:55:48 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 1325 invoked from network); 7 Aug 2015 01:55:47 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=+NsIqgl7P79d6TcGP5G2eWheZOQCyv1K0IFVs+NTS3M=; b=bnzqs+uyQD9ryEcWHH1gZBPdgYnR3TCszzFdwfhooirOMq4mto7e0PE44GXn/Q4QUg 3OCdeUrJ/r9fivk3qK04kfOyoNpD/kJXZSpS665xyvxug4+P0J9gPkb1O8UV6NL4g+YP VxDAOVv+IB3gWZeAMOIMg15YfASDttqsJODXfxN2JFtXmXYJd2uJQrHoRFRCjmADM4vO of6zLwaur/7CQFP0lMytomXEJVRgsrrZOX3OfEIQhQtAUmCJCut54yhyJyj55rW8slVG 3T5j30EGea0QOjetgUXhkACKWDbOoPNBFor0BLRIwPTYU1jeJwaZqSGqjgjyosxTMN5U 66PQ== X-Received: by 10.50.30.196 with SMTP id u4mr855461igh.11.1438912536208; Thu, 06 Aug 2015 18:55:36 -0700 (PDT) In-Reply-To: <20150806224749.GA32423@port70.net> Xref: news.gmane.org gmane.linux.lib.musl.general:8269 Archived-At: On Thu, Aug 6, 2015 at 3:47 PM, Szabolcs Nagy wrote: > * Felix Fietkau [2015-07-10 13:02:51 +0200]: >> Some PowerPC CPUs (e.g. Freescale MPC85xx) have a completely different >> instruction set for floating point operations (SPE). >> Executing regular PowerPC floating point instructions results in >> "Illegal instruction" errors. >> >> Make it possible to run these devices in soft-float mode. >> > > thanks, this looks good > > i used > > #define MUSL_DYNAMIC_LINKER \ > "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1" > > in gcc to get a soft float toolchain. > (MUSL_DYNAMIC_LINKER_E is "le" on little endian). > but i'm not yet sure if -msoft-float is always passed > down by gcc for soft float targets. use --with-float=soft --disable-altivec to configure gcc or may be target triplet powerpc-linux-musl-gnuspe would work too. > > (the gcc config files are rather messy, there might be more > ppc abi variants lurking there) > >> Signed-off-by: Felix Fietkau >> --- >> arch/powerpc/reloc.h | 8 ++++++- >> configure | 4 ++++ >> src/fenv/powerpc-sf/fenv.sub | 1 + > > this is not enough for fenv. > > unsupported FE_* macros must be hidden in arch/powerpc/bits/fenv.h > (see e.g. how arm does it), exceptions and non-nearest rounding > are not supported for soft float. > > the rest looks ok to me. > >> src/setjmp/powerpc-sf/longjmp.s | 47 +++++++++++++++++++++++++++++++++++++++ >> src/setjmp/powerpc-sf/longjmp.sub | 1 + >> src/setjmp/powerpc-sf/setjmp.s | 43 +++++++++++++++++++++++++++++++++++ >> src/setjmp/powerpc-sf/setjmp.sub | 1 + >> 7 files changed, 104 insertions(+), 1 deletion(-) >> create mode 100644 src/fenv/powerpc-sf/fenv.sub >> create mode 100644 src/setjmp/powerpc-sf/longjmp.s >> create mode 100644 src/setjmp/powerpc-sf/longjmp.sub >> create mode 100644 src/setjmp/powerpc-sf/setjmp.s >> create mode 100644 src/setjmp/powerpc-sf/setjmp.sub >> >> diff --git a/arch/powerpc/reloc.h b/arch/powerpc/reloc.h >> index aa5f8c9..7880fb5 100644 >> --- a/arch/powerpc/reloc.h >> +++ b/arch/powerpc/reloc.h >> @@ -1,4 +1,10 @@ >> -#define LDSO_ARCH "powerpc" >> +#ifdef _SOFT_FLOAT >> +#define FP_SUFFIX "-sf" >> +#else >> +#define FP_SUFFIX "" >> +#endif >> + >> +#define LDSO_ARCH "powerpc" FP_SUFFIX >> >> #define TPOFF_K (-0x7000) >> >> diff --git a/configure b/configure >> index beed406..1e94f06 100755 >> --- a/configure >> +++ b/configure >> @@ -522,6 +522,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el >> trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf >> fi >> >> +if test "$ARCH" = "powerpc" ; then >> +trycppif _SOFT_FLOAT "$t" && SUBARCH=${SUBARCH}-sf >> +fi >> + >> test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ >> && SUBARCH=${SUBARCH}el >> >> diff --git a/src/fenv/powerpc-sf/fenv.sub b/src/fenv/powerpc-sf/fenv.sub >> new file mode 100644 >> index 0000000..9cafca5 >> --- /dev/null >> +++ b/src/fenv/powerpc-sf/fenv.sub >> @@ -0,0 +1 @@ >> +../fenv.c >> diff --git a/src/setjmp/powerpc-sf/longjmp.s b/src/setjmp/powerpc-sf/longjmp.s >> new file mode 100644 >> index 0000000..fd61ae7 >> --- /dev/null >> +++ b/src/setjmp/powerpc-sf/longjmp.s >> @@ -0,0 +1,47 @@ >> + .global _longjmp >> + .global longjmp >> + .type _longjmp,@function >> + .type longjmp,@function >> +_longjmp: >> +longjmp: >> +# void longjmp(jmp_buf env, int val); >> +# put val into return register and restore the env saved in setjmp >> +# if val(r4) is 0, put 1 there. >> + # 0) move old return address into r0 >> + lwz 0, 0(3) >> + # 1) put it into link reg >> + mtlr 0 >> + #2 ) restore stack ptr >> + lwz 1, 4(3) >> + #3) restore control reg >> + lwz 0, 8(3) >> + mtcr 0 >> + #4) restore r14-r31 >> + lwz 14, 12(3) >> + lwz 15, 16(3) >> + lwz 16, 20(3) >> + lwz 17, 24(3) >> + lwz 18, 28(3) >> + lwz 19, 32(3) >> + lwz 20, 36(3) >> + lwz 21, 40(3) >> + lwz 22, 44(3) >> + lwz 23, 48(3) >> + lwz 24, 52(3) >> + lwz 25, 56(3) >> + lwz 26, 60(3) >> + lwz 27, 64(3) >> + lwz 28, 68(3) >> + lwz 29, 72(3) >> + lwz 30, 76(3) >> + lwz 31, 80(3) >> + #5) put val into return reg r3 >> + mr 3, 4 >> + >> + #6) check if return value is 0, make it 1 in that case >> + cmpwi cr7, 4, 0 >> + bne cr7, 1f >> + li 3, 1 >> +1: >> + blr >> + >> diff --git a/src/setjmp/powerpc-sf/longjmp.sub b/src/setjmp/powerpc-sf/longjmp.sub >> new file mode 100644 >> index 0000000..e80331b >> --- /dev/null >> +++ b/src/setjmp/powerpc-sf/longjmp.sub >> @@ -0,0 +1 @@ >> +longjmp.s >> diff --git a/src/setjmp/powerpc-sf/setjmp.s b/src/setjmp/powerpc-sf/setjmp.s >> new file mode 100644 >> index 0000000..17c2663 >> --- /dev/null >> +++ b/src/setjmp/powerpc-sf/setjmp.s >> @@ -0,0 +1,43 @@ >> + .global ___setjmp >> + .hidden ___setjmp >> + .global __setjmp >> + .global _setjmp >> + .global setjmp >> + .type __setjmp,@function >> + .type _setjmp,@function >> + .type setjmp,@function >> +___setjmp: >> +__setjmp: >> +_setjmp: >> +setjmp: >> + # 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) >> + mflr 0 >> + stw 0, 0(3) >> + # 1) store reg1 (SP) >> + stw 1, 4(3) >> + # 2) store cr >> + mfcr 0 >> + stw 0, 8(3) >> + # 3) store r14-31 >> + stw 14, 12(3) >> + stw 15, 16(3) >> + stw 16, 20(3) >> + stw 17, 24(3) >> + stw 18, 28(3) >> + stw 19, 32(3) >> + stw 20, 36(3) >> + stw 21, 40(3) >> + stw 22, 44(3) >> + stw 23, 48(3) >> + stw 24, 52(3) >> + stw 25, 56(3) >> + stw 26, 60(3) >> + stw 27, 64(3) >> + stw 28, 68(3) >> + stw 29, 72(3) >> + stw 30, 76(3) >> + stw 31, 80(3) >> + # 4) set return value to 0 >> + li 3, 0 >> + # 5) return >> + blr >> diff --git a/src/setjmp/powerpc-sf/setjmp.sub b/src/setjmp/powerpc-sf/setjmp.sub >> new file mode 100644 >> index 0000000..b7ad221 >> --- /dev/null >> +++ b/src/setjmp/powerpc-sf/setjmp.sub >> @@ -0,0 +1 @@ >> +setjmp.s >> -- >> 2.2.2