[Xen-devel,for-4.13] xen/arm32: head: Fix build when using GAS 2.25.0

Message ID 20190930184425.13756-1-julien.grall@arm.com
State New
Headers show
Series
  • [Xen-devel,for-4.13] xen/arm32: head: Fix build when using GAS 2.25.0
Related show

Commit Message

Julien Grall Sept. 30, 2019, 6:44 p.m.
GAS 2.25.0 throws multiple errors when building arm32/head.S:

arm32/head.S: Assembler messages:
arm32/head.S:452: Error: invalid constant (f7f) after fixup
arm32/head.S:453: Error: invalid constant (f7f) after fixup
arm32/head.S:495: Error: invalid constant (f7f) after fixup
arm32/head.S:510: Error: invalid constant (f7f) after fixup
arm32/head.S:514: Error: invalid constant (f7f) after fixup
arm32/head.S:516: Error: invalid constant (f7f) after fixup
arm32/head.S:633: Error: invalid constant (f7f) after fixup

This makes sense because the instruction mov is only able to deal with a
specific set of immediate (see "modified immediate constants in ARM
instructions"). For any 16-bit immediate, the instruction movw should be
used.

It looks like newer version of GAS will seemly switch to movw if the
immediate does not fit in the immediate encoding for mov. But we should
not rely on this. So switch to movw.

Fixes: 23dfe48d10 ("xen/arm32: head: Introduce macros to create table and mapping entry")
Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Julien Grall <julien.grall@arm.com>
---
 xen/arch/arm/arm32/head.S | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Andrew Cooper Sept. 30, 2019, 6:55 p.m. | #1
On 30/09/2019 19:44, Julien Grall wrote:
> GAS 2.25.0 throws multiple errors when building arm32/head.S:
>
> arm32/head.S: Assembler messages:
> arm32/head.S:452: Error: invalid constant (f7f) after fixup
> arm32/head.S:453: Error: invalid constant (f7f) after fixup
> arm32/head.S:495: Error: invalid constant (f7f) after fixup
> arm32/head.S:510: Error: invalid constant (f7f) after fixup
> arm32/head.S:514: Error: invalid constant (f7f) after fixup
> arm32/head.S:516: Error: invalid constant (f7f) after fixup
> arm32/head.S:633: Error: invalid constant (f7f) after fixup
>
> This makes sense because the instruction mov is only able to deal with a
> specific set of immediate (see "modified immediate constants in ARM
> instructions"). For any 16-bit immediate, the instruction movw should be
> used.
>
> It looks like newer version of GAS will seemly switch to movw if the
> immediate does not fit in the immediate encoding for mov. But we should
> not rely on this. So switch to movw.
>
> Fixes: 23dfe48d10 ("xen/arm32: head: Introduce macros to create table and mapping entry")
> Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Signed-off-by: Julien Grall <julien.grall@arm.com>

FWIW, Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>, only insofar
as it fixing the build.  I haven't booted the resulting binary.
Stefano Stabellini Oct. 1, 2019, 12:57 a.m. | #2
On Mon, 30 Sep 2019, Andrew Cooper wrote:
> On 30/09/2019 19:44, Julien Grall wrote:

> > GAS 2.25.0 throws multiple errors when building arm32/head.S:

> >

> > arm32/head.S: Assembler messages:

> > arm32/head.S:452: Error: invalid constant (f7f) after fixup

> > arm32/head.S:453: Error: invalid constant (f7f) after fixup

> > arm32/head.S:495: Error: invalid constant (f7f) after fixup

> > arm32/head.S:510: Error: invalid constant (f7f) after fixup

> > arm32/head.S:514: Error: invalid constant (f7f) after fixup

> > arm32/head.S:516: Error: invalid constant (f7f) after fixup

> > arm32/head.S:633: Error: invalid constant (f7f) after fixup

> >

> > This makes sense because the instruction mov is only able to deal with a

> > specific set of immediate (see "modified immediate constants in ARM

> > instructions"). For any 16-bit immediate, the instruction movw should be

> > used.

> >

> > It looks like newer version of GAS will seemly switch to movw if the

> > immediate does not fit in the immediate encoding for mov. But we should

> > not rely on this. So switch to movw.

> >

> > Fixes: 23dfe48d10 ("xen/arm32: head: Introduce macros to create table and mapping entry")

> > Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>

> > Signed-off-by: Julien Grall <julien.grall@arm.com>

> 

> FWIW, Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>, only insofar

> as it fixing the build.  I haven't booted the resulting binary.


Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


Given that this is a straightforward build fix, and due to timezone
differences, I have committed it (after verifying it fixes the build
myself). I hope that Juergen approves.
Jürgen Groß Oct. 1, 2019, 5:27 a.m. | #3
On 01.10.19 02:57, Stefano Stabellini wrote:
> On Mon, 30 Sep 2019, Andrew Cooper wrote:
>> On 30/09/2019 19:44, Julien Grall wrote:
>>> GAS 2.25.0 throws multiple errors when building arm32/head.S:
>>>
>>> arm32/head.S: Assembler messages:
>>> arm32/head.S:452: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:453: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:495: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:510: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:514: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:516: Error: invalid constant (f7f) after fixup
>>> arm32/head.S:633: Error: invalid constant (f7f) after fixup
>>>
>>> This makes sense because the instruction mov is only able to deal with a
>>> specific set of immediate (see "modified immediate constants in ARM
>>> instructions"). For any 16-bit immediate, the instruction movw should be
>>> used.
>>>
>>> It looks like newer version of GAS will seemly switch to movw if the
>>> immediate does not fit in the immediate encoding for mov. But we should
>>> not rely on this. So switch to movw.
>>>
>>> Fixes: 23dfe48d10 ("xen/arm32: head: Introduce macros to create table and mapping entry")
>>> Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>> Signed-off-by: Julien Grall <julien.grall@arm.com>
>>
>> FWIW, Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>, only insofar
>> as it fixing the build.  I haven't booted the resulting binary.
> 
> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> 
> Given that this is a straightforward build fix, and due to timezone
> differences, I have committed it (after verifying it fixes the build
> myself). I hope that Juergen approves.
> 

I do.


Juergen

Patch

diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index 2fc312f9e0..e9d356f05c 100644
--- a/xen/arch/arm/arm32/head.S
+++ b/xen/arch/arm/arm32/head.S
@@ -383,7 +383,7 @@  ENDPROC(cpu_init)
         ldr   r4, =\tbl
         add   r4, r4, r10            /* r4 := paddr(\tlb) */
 
-        mov   r2, #PT_PT             /* r2:r3 := right for linear PT */
+        movw  r2, #PT_PT             /* r2:r3 := right for linear PT */
         orr   r2, r2, r4             /*           + \tlb paddr */
         mov   r3, #0
 
@@ -419,7 +419,7 @@  ENDPROC(cpu_init)
         lsr   r4, \phys, #THIRD_SHIFT
         lsl   r4, r4, #THIRD_SHIFT   /* r4 := PAGE_ALIGNED(phys) */
 
-        mov   r2, #\type             /* r2:r3 := right for section PT */
+        movw  r2, #\type             /* r2:r3 := right for section PT */
         orr   r2, r2, r4             /*          + PAGE_ALIGNED(phys) */
         mov   r3, #0