|
Message-ID: <CAMKF1sq-jfvp7E8RxZ=bkST78sVue8CZeEEFTjCtvYUrWcN_cA@mail.gmail.com> Date: Thu, 6 Aug 2015 18:55:06 -0700 From: Khem Raj <raj.khem@...il.com> To: musl@...ts.openwall.com Subject: Re: [PATCH v2] Add PowerPC soft-float support On Thu, Aug 6, 2015 at 3:47 PM, Szabolcs Nagy <nsz@...t70.net> wrote: > * Felix Fietkau <nbd@...nwrt.org> [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 <nbd@...nwrt.org> >> --- >> 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
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.