All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markos Chandras <Markos.Chandras@imgtec.com>
To: Manuel Lauss <manuel.lauss@gmail.com>,
	Linux-MIPS <linux-mips@linux-mips.org>
Cc: Ralf Baechle <ralf@linux-mips.org>,
	"Maciej W. Rozycki" <macro@linux-mips.org>,
	Matthew Fortune <Matthew.Fortune@imgtec.com>
Subject: Re: [RFC PATCH v3] MIPS: fix build with binutils 2.24.51+
Date: Thu, 23 Oct 2014 16:20:36 +0100	[thread overview]
Message-ID: <54491CC4.2060304@imgtec.com> (raw)
In-Reply-To: <1413022164-317664-1-git-send-email-manuel.lauss@gmail.com>

(top posting so Matthew can see the entire patch)

+CC Matthew Fortune who has some comments on the patch.

On 10/11/2014 11:09 AM, Manuel Lauss wrote:
> Starting with version 2.24.51.20140728 MIPS binutils complain loudly
> about mixing soft-float and hard-float object files, leading to this
> build failure since GCC is invoked with "-msoft-float" on MIPS:
> 
> {standard input}: Warning: .gnu_attribute 4,3 requires `softfloat'
>   LD      arch/mips/alchemy/common/built-in.o
> mipsel-softfloat-linux-gnu-ld: Warning: arch/mips/alchemy/common/built-in.o
>  uses -msoft-float (set by arch/mips/alchemy/common/prom.o),
>  arch/mips/alchemy/common/sleeper.o uses -mhard-float
> 
> To fix this, we detect if GAS is new enough to support "-msoft-float" command
> option, and if it does, we can let GCC pass it to GAS;  but then we also need
> to sprinkle the files which make use of floating point registers with the
> necessary ".set hardfloat" directives.
> 
> Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
> ---
> I've only tested a mips32r1 build, but at least binutils-2.23 and a
> snapshot from today (with the MIPS fp changes) compile a bootable
> kernel.
> 
> Tests on 64bit and with MSA and other extensions also appreciated!
> 
> v3: incorporate Maciej's suggestions:
> 	- detect if gas can handle -msoft-float and ".set hardfloat"
> 	- apply .set hardfloat only where really necessary
> 
> v2: cover more files
> 
> This was introduced in binutils commit  351cdf24d223290b15fa991e5052ec9e9bd1e284
> ("[MIPS] Implement O32 FPXX, FP64 and FP64A ABI extensions").
> 
>  arch/mips/Makefile                  |  9 +++++++++
>  arch/mips/include/asm/asmmacro-32.h |  5 +++++
>  arch/mips/include/asm/asmmacro.h    | 18 ++++++++++++++++++
>  arch/mips/include/asm/fpregdef.h    | 14 ++++++++++++++
>  arch/mips/include/asm/mipsregs.h    | 19 +++++++++++++++++++
>  arch/mips/kernel/genex.S            |  1 +
>  arch/mips/kernel/r2300_switch.S     |  5 +++++
>  arch/mips/kernel/r4k_fpu.S          |  7 +++++++
>  arch/mips/kernel/r4k_switch.S       |  9 +++++++++
>  arch/mips/kernel/r6000_fpu.S        |  5 +++++
>  10 files changed, 92 insertions(+)
> 
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index bbac51e1..35005e1 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -93,6 +93,15 @@ LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
>  KBUILD_AFLAGS_MODULE		+= -mlong-calls
>  KBUILD_CFLAGS_MODULE		+= -mlong-calls
> 
> +#
> +# pass -msoft-float to GAS if it supports it.  However on newer binutils
> +# (specifically newer than 2.24.51.20140728) we then also need to explicitly
> +# set ".set hardfloat" in all files which manipulate floating point registers.
> +#
> +ifneq ($(call as-option,-Wa$(comma)-msoft-float,),)
> +	cflags-y		+= -DGAS_HAS_SET_HARDFLOAT -Wa,-msoft-float
> +endif
> +
>  cflags-y += -ffreestanding
> 
>  #
> diff --git a/arch/mips/include/asm/asmmacro-32.h b/arch/mips/include/asm/asmmacro-32.h
> index e38c281..a97ce53 100644
> --- a/arch/mips/include/asm/asmmacro-32.h
> +++ b/arch/mips/include/asm/asmmacro-32.h
> @@ -12,6 +12,9 @@
>  #include <asm/fpregdef.h>
>  #include <asm/mipsregs.h>
> 
> +	.set push
> +	SET_HARDFLOAT
> +
>  	.macro	fpu_save_single thread tmp=t0
>  	cfc1	\tmp,  fcr31
>  	swc1	$f0,  THREAD_FPR0_LS64(\thread)
> @@ -86,6 +89,8 @@
>  	ctc1	\tmp, fcr31
>  	.endm
> 
> +	.set pop
> +
>  	.macro	cpu_save_nonscratch thread
>  	LONG_S	s0, THREAD_REG16(\thread)
>  	LONG_S	s1, THREAD_REG17(\thread)
> diff --git a/arch/mips/include/asm/asmmacro.h b/arch/mips/include/asm/asmmacro.h
> index cd9a98b..6caf876 100644
> --- a/arch/mips/include/asm/asmmacro.h
> +++ b/arch/mips/include/asm/asmmacro.h
> @@ -57,6 +57,8 @@
>  #endif /* CONFIG_CPU_MIPSR2 */
> 
>  	.macro	fpu_save_16even thread tmp=t0
> +	.set	push
> +	SET_HARDFLOAT
>  	cfc1	\tmp, fcr31
>  	sdc1	$f0,  THREAD_FPR0_LS64(\thread)
>  	sdc1	$f2,  THREAD_FPR2_LS64(\thread)
> @@ -75,11 +77,13 @@
>  	sdc1	$f28, THREAD_FPR28_LS64(\thread)
>  	sdc1	$f30, THREAD_FPR30_LS64(\thread)
>  	sw	\tmp, THREAD_FCR31(\thread)
> +	.set	pop
>  	.endm
> 
>  	.macro	fpu_save_16odd thread
>  	.set	push
>  	.set	mips64r2
> +	SET_HARDFLOAT
>  	sdc1	$f1,  THREAD_FPR1_LS64(\thread)
>  	sdc1	$f3,  THREAD_FPR3_LS64(\thread)
>  	sdc1	$f5,  THREAD_FPR5_LS64(\thread)
> @@ -110,6 +114,8 @@
>  	.endm
> 
>  	.macro	fpu_restore_16even thread tmp=t0
> +	.set	push
> +	SET_HARDFLOAT
>  	lw	\tmp, THREAD_FCR31(\thread)
>  	ldc1	$f0,  THREAD_FPR0_LS64(\thread)
>  	ldc1	$f2,  THREAD_FPR2_LS64(\thread)
> @@ -133,6 +139,7 @@
>  	.macro	fpu_restore_16odd thread
>  	.set	push
>  	.set	mips64r2
> +	SET_HARDFLOAT
>  	ldc1	$f1,  THREAD_FPR1_LS64(\thread)
>  	ldc1	$f3,  THREAD_FPR3_LS64(\thread)
>  	ldc1	$f5,  THREAD_FPR5_LS64(\thread)
> @@ -277,6 +284,7 @@
>  	.macro	cfcmsa	rd, cs
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	.insn
>  	.word	CFC_MSA_INSN | (\cs << 11)
>  	move	\rd, $1
> @@ -286,6 +294,7 @@
>  	.macro	ctcmsa	cd, rs
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	move	$1, \rs
>  	.word	CTC_MSA_INSN | (\cd << 6)
>  	.set	pop
> @@ -294,6 +303,7 @@
>  	.macro	ld_d	wd, off, base
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	add	$1, \base, \off
>  	.word	LDD_MSA_INSN | (\wd << 6)
>  	.set	pop
> @@ -302,6 +312,7 @@
>  	.macro	st_d	wd, off, base
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	add	$1, \base, \off
>  	.word	STD_MSA_INSN | (\wd << 6)
>  	.set	pop
> @@ -310,6 +321,7 @@
>  	.macro	copy_u_w	rd, ws, n
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	.insn
>  	.word	COPY_UW_MSA_INSN | (\n << 16) | (\ws << 11)
>  	/* move triggers an assembler bug... */
> @@ -320,6 +332,7 @@
>  	.macro	copy_u_d	rd, ws, n
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	.insn
>  	.word	COPY_UD_MSA_INSN | (\n << 16) | (\ws << 11)
>  	/* move triggers an assembler bug... */
> @@ -330,6 +343,7 @@
>  	.macro	insert_w	wd, n, rs
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	/* move triggers an assembler bug... */
>  	or	$1, \rs, zero
>  	.word	INSERT_W_MSA_INSN | (\n << 16) | (\wd << 6)
> @@ -339,6 +353,7 @@
>  	.macro	insert_d	wd, n, rs
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	/* move triggers an assembler bug... */
>  	or	$1, \rs, zero
>  	.word	INSERT_D_MSA_INSN | (\n << 16) | (\wd << 6)
> @@ -381,6 +396,7 @@
>  	st_d	31, THREAD_FPR31, \thread
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	cfcmsa	$1, MSA_CSR
>  	sw	$1, THREAD_MSA_CSR(\thread)
>  	.set	pop
> @@ -389,6 +405,7 @@
>  	.macro	msa_restore_all	thread
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	lw	$1, THREAD_MSA_CSR(\thread)
>  	ctcmsa	MSA_CSR, $1
>  	.set	pop
> @@ -441,6 +458,7 @@
>  	.macro	msa_init_all_upper
>  	.set	push
>  	.set	noat
> +	SET_HARDFLOAT
>  	not	$1, zero
>  	msa_init_upper	0
>  	.set	pop
> diff --git a/arch/mips/include/asm/fpregdef.h b/arch/mips/include/asm/fpregdef.h
> index 429481f..f184ba0 100644
> --- a/arch/mips/include/asm/fpregdef.h
> +++ b/arch/mips/include/asm/fpregdef.h
> @@ -14,6 +14,20 @@
> 
>  #include <asm/sgidefs.h>
> 
> +/*
> + * starting with binutils 2.24.51.20140729, MIPS binutils warn about mixing
> + * hardfloat and softfloat object files.  The kernel build uses soft-float by
> + * default, so we also need to pass -msoft-float along to GAS if it supports it.
> + * But this in turn causes assembler errors in files which access hardfloat
> + * registers.  We detect if GAS supports "-msoft-float" in the Makefile and
> + * explicitly put ".set hardfloat" where floating point registers are touched.
> + */
> +#ifdef GAS_HAS_SET_HARDFLOAT
> +#define SET_HARDFLOAT .set hardfloat
> +#else
> +#define SET_HARDFLOAT
> +#endif
> +
>  #if _MIPS_SIM == _MIPS_SIM_ABI32
> 
>  /*
> diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
> index cf3b580..889c012 100644
> --- a/arch/mips/include/asm/mipsregs.h
> +++ b/arch/mips/include/asm/mipsregs.h
> @@ -1324,6 +1324,7 @@ do {									\
>  /*
>   * Macros to access the floating point coprocessor control registers
>   */
> +#ifdef GAS_HAS_SET_HARDFLOAT
>  #define read_32bit_cp1_register(source)					\
>  ({									\
>  	int __res;							\
> @@ -1334,11 +1335,29 @@ do {									\
>  	"	# gas fails to assemble cfc1 for some archs,	\n"	\
>  	"	# like Octeon.					\n"	\
>  	"	.set	mips1					\n"	\
> +	"	.set	hardfloat				\n"	\
>  	"	cfc1	%0,"STR(source)"			\n"	\
>  	"	.set	pop					\n"	\
>  	: "=r" (__res));						\
>  	__res;								\
>  })
> +#else
> +#define read_32bit_cp1_register(source)					\
> +({									\
> +	int __res;							\
> +									\
> +	__asm__ __volatile__(						\
> +	"	.set	push					\n"	\
> +	"	.set	reorder					\n"	\
> +	"	# gas fails to assemble cfc1 for some archs,	\n"	\
> +	"	# like Octeon.					\n"	\
> +	"	.set	mips1					\n"	\
> +	"	cfc1	%0,"STR(source)"			\n"	\
> +	"	.set	pop					\n"	\
> +	: "=r" (__res));						\
> +	__res;								\
> +})
> +#endif
> 
>  #ifdef HAVE_AS_DSP
>  #define rddsp(mask)							\
> diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
> index ac35e12..a5e26dd 100644
> --- a/arch/mips/kernel/genex.S
> +++ b/arch/mips/kernel/genex.S
> @@ -358,6 +358,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
>  	.set	push
>  	/* gas fails to assemble cfc1 for some archs (octeon).*/ \
>  	.set	mips1
> +	SET_HARDFLOAT
>  	cfc1	a1, fcr31
>  	li	a2, ~(0x3f << 12)
>  	and	a2, a1
> diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S
> index 20b7b04..435ea65 100644
> --- a/arch/mips/kernel/r2300_switch.S
> +++ b/arch/mips/kernel/r2300_switch.S
> @@ -120,6 +120,9 @@ LEAF(_restore_fp)
> 
>  #define FPU_DEFAULT  0x00000000
> 
> +	.set push
> +	SET_HARDFLOAT
> +
>  LEAF(_init_fpu)
>  	mfc0	t0, CP0_STATUS
>  	li	t1, ST0_CU1
> @@ -165,3 +168,5 @@ LEAF(_init_fpu)
>  	mtc1	t0, $f31
>  	jr	ra
>  	END(_init_fpu)
> +
> +	.set pop
> diff --git a/arch/mips/kernel/r4k_fpu.S b/arch/mips/kernel/r4k_fpu.S
> index 8352523..4a827a3 100644
> --- a/arch/mips/kernel/r4k_fpu.S
> +++ b/arch/mips/kernel/r4k_fpu.S
> @@ -21,6 +21,7 @@
> 
>  	.macro	EX insn, reg, src
>  	.set	push
> +	SET_HARDFLOAT
>  	.set	nomacro
>  .ex\@:	\insn	\reg, \src
>  	.set	pop
> @@ -33,7 +34,10 @@
>  	.set	arch=r4000
> 
>  LEAF(_save_fp_context)
> +	.set	push
> +	SET_HARDFLOAT
>  	cfc1	t1, fcr31
> +	.set	pop
> 
>  #if defined(CONFIG_64BIT) || defined(CONFIG_CPU_MIPS32_R2)
>  	.set	push
> @@ -191,7 +195,10 @@ LEAF(_restore_fp_context)
>  	EX	ldc1 $f26, SC_FPREGS+208(a0)
>  	EX	ldc1 $f28, SC_FPREGS+224(a0)
>  	EX	ldc1 $f30, SC_FPREGS+240(a0)
> +	.set push
> +	SET_HARDFLOAT
>  	ctc1	t1, fcr31
> +	.set pop
>  	jr	ra
>  	 li	v0, 0					# success
>  	END(_restore_fp_context)
> diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S
> index 4c4ec18..6467a8b 100644
> --- a/arch/mips/kernel/r4k_switch.S
> +++ b/arch/mips/kernel/r4k_switch.S
> @@ -65,8 +65,12 @@
>  	bgtz	a3, 1f
> 
>  	/* Save 128b MSA vector context + scalar FP control & status. */
> +	.set push
> +	SET_HARDFLOAT
>  	cfc1	t1, fcr31
>  	msa_save_all	a0
> +	.set pop	/* SET_HARDFLOAT */
> +
>  	sw	t1, THREAD_FCR31(a0)
>  	b	2f
> 
> @@ -161,6 +165,9 @@ LEAF(_init_msa_upper)
> 
>  #define FPU_DEFAULT  0x00000000
> 
> +	.set push
> +	SET_HARDFLOAT
> +
>  LEAF(_init_fpu)
>  	mfc0	t0, CP0_STATUS
>  	li	t1, ST0_CU1
> @@ -291,3 +298,5 @@ LEAF(_init_fpu)
>  #endif
>  	jr	ra
>  	END(_init_fpu)
> +
> +	.set pop	/* SET_HARDFLOAT */
> diff --git a/arch/mips/kernel/r6000_fpu.S b/arch/mips/kernel/r6000_fpu.S
> index da0fbe4..4707738 100644
> --- a/arch/mips/kernel/r6000_fpu.S
> +++ b/arch/mips/kernel/r6000_fpu.S
> @@ -18,6 +18,9 @@
> 
>  	.set	noreorder
>  	.set	mips2
> +	.set	push
> +	SET_HARDFLOAT
> +
>  	/* Save floating point context */
>  	LEAF(_save_fp_context)
>  	mfc0	t0,CP0_STATUS
> @@ -85,3 +88,5 @@
>  1:	jr	ra
>  	 nop
>  	END(_restore_fp_context)
> +
> +	.set pop	/* SET_HARDFLOAT */
> --
> 2.1.2
> 
> 

-- 
markos

  parent reply	other threads:[~2014-10-23 15:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-11 10:09 [RFC PATCH v3] MIPS: fix build with binutils 2.24.51+ Manuel Lauss
2014-10-23 11:58 ` Markos Chandras
2014-10-23 12:22   ` Markos Chandras
2014-10-23 12:22     ` Markos Chandras
2014-10-23 15:20 ` Markos Chandras [this message]
2014-10-23 16:21   ` Matthew Fortune
2014-10-23 17:10     ` Manuel Lauss

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54491CC4.2060304@imgtec.com \
    --to=markos.chandras@imgtec.com \
    --cc=Matthew.Fortune@imgtec.com \
    --cc=linux-mips@linux-mips.org \
    --cc=macro@linux-mips.org \
    --cc=manuel.lauss@gmail.com \
    --cc=ralf@linux-mips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.