musl: add powerpc soft-float support
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 46267
This commit is contained in:
		
							
								
								
									
										141
									
								
								toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| From: Felix Fietkau <nbd@openwrt.org> | ||||
| Date: Wed, 8 Jul 2015 13:56:37 +0200 | ||||
| Subject: [PATCH] Add PowerPC soft-float support | ||||
|  | ||||
| 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. | ||||
|  | ||||
| Until support for SPE FPU is added, make it possible to run these | ||||
| devices in soft-float mode. | ||||
|  | ||||
| Signed-off-by: Felix Fietkau <nbd@openwrt.org> | ||||
| --- | ||||
|  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 | ||||
|  | ||||
| --- a/configure | ||||
| +++ b/configure | ||||
| @@ -498,6 +498,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE | ||||
|  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 | ||||
|   | ||||
| --- /dev/null | ||||
| +++ b/src/fenv/powerpc-sf/fenv.sub | ||||
| @@ -0,0 +1 @@ | ||||
| +../fenv.c | ||||
| --- /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 | ||||
| + | ||||
| --- /dev/null | ||||
| +++ b/src/setjmp/powerpc-sf/longjmp.sub | ||||
| @@ -0,0 +1 @@ | ||||
| +longjmp.s | ||||
| --- /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 | ||||
| --- /dev/null | ||||
| +++ b/src/setjmp/powerpc-sf/setjmp.sub | ||||
| @@ -0,0 +1 @@ | ||||
| +setjmp.s | ||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau