2019-02-07 09:49:16

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 0/5] ARM: convert to unified syntax

This patchset converts all assembly code to unified assembler
language (UAL) compatible assembly code. From what I can tell,
this mainly boils down to using conditional infixes instead of
postfixes.

Most of the conversion has been done using the following regular
expression:
find ./arch/arm/ -name "*.[hSc]" -exec sed -i -r \
"s/^((\s*[._a-zA-Z0-9]*[\:\(])?\s*)([a-z]{3})(eq|ne|cs|hs|cc|lo|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al)([a-z]{1,2})(\s)/\1\3\5\4\6/"
\
{} \;

The expression resulted in some false positives and missed some
instances where infix conditionals have been used. With this
changes applied, I compiled several kernel configurations
successfully and without a warning.

The file arch/arm/probes/kprobes/test-arm.c is still using some
divided syntax assembler.

This does not allow to use LLVM's integrated assembler just yet,
there is still some assembler which the integrated assembler does
not like (yet). But it is a big step towards that direction.

--
Stefan

Stefan Agner (5):
ARM: use unified assembler in macros
ARM: use unified assembler in headers
ARM: use unified assembler in assembly files
ARM: use unified assembler in c files
ARM: warn if divided syntax assembler is used

arch/arm/Makefile | 3 --
arch/arm/boot/bootp/init.S | 2 +-
arch/arm/boot/compressed/ll_char_wr.S | 4 +-
arch/arm/include/asm/assembler.h | 8 ++--
.../include/asm/hardware/entry-macro-iomd.S | 10 ++---
arch/arm/include/asm/vfpmacros.h | 8 ++--
arch/arm/include/debug/tegra.S | 2 +-
arch/arm/kernel/debug.S | 2 +-
arch/arm/kernel/entry-armv.S | 12 +++---
arch/arm/kernel/entry-common.S | 2 +-
arch/arm/kernel/entry-header.S | 8 ++--
arch/arm/lib/bitops.h | 8 ++--
arch/arm/lib/clear_user.S | 2 +-
arch/arm/lib/copy_from_user.S | 2 +-
arch/arm/lib/copy_page.S | 4 +-
arch/arm/lib/copy_template.S | 4 +-
arch/arm/lib/copy_to_user.S | 2 +-
arch/arm/lib/csumpartial.S | 20 ++++-----
arch/arm/lib/csumpartialcopygeneric.S | 4 +-
arch/arm/lib/csumpartialcopyuser.S | 2 +-
arch/arm/lib/div64.S | 4 +-
arch/arm/lib/floppydma.S | 10 ++---
arch/arm/lib/io-readsb.S | 20 ++++-----
arch/arm/lib/io-readsl.S | 2 +-
arch/arm/lib/io-readsw-armv3.S | 6 +--
arch/arm/lib/io-readsw-armv4.S | 12 +++---
arch/arm/lib/io-writesb.S | 20 ++++-----
arch/arm/lib/io-writesl.S | 2 +-
arch/arm/lib/io-writesw-armv3.S | 2 +-
arch/arm/lib/io-writesw-armv4.S | 6 +--
arch/arm/lib/lib1funcs.S | 4 +-
arch/arm/lib/memcpy.S | 4 +-
arch/arm/lib/memmove.S | 24 +++++------
arch/arm/lib/memset.S | 42 +++++++++----------
.../mach-ks8695/include/mach/entry-macro.S | 2 +-
arch/arm/mach-tegra/reset-handler.S | 2 +-
arch/arm/mm/cache-v6.S | 8 ++--
arch/arm/mm/copypage-v4mc.c | 2 +-
arch/arm/mm/copypage-v4wb.c | 2 +-
arch/arm/mm/copypage-v4wt.c | 2 +-
arch/arm/mm/proc-v7m.S | 4 +-
41 files changed, 143 insertions(+), 146 deletions(-)

--
2.20.1



2019-02-07 09:47:31

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 3/5] ARM: use unified assembler in assembly files

Use unified assembler syntax (UAL) in assembly files. Divided
syntax is considered depricated. This will also allow to build
the kernel using LLVM's integrated assembler.

Signed-off-by: Stefan Agner <[email protected]>
---
arch/arm/boot/bootp/init.S | 2 +-
arch/arm/boot/compressed/ll_char_wr.S | 4 +-
.../include/asm/hardware/entry-macro-iomd.S | 10 ++---
arch/arm/include/debug/tegra.S | 2 +-
arch/arm/kernel/debug.S | 2 +-
arch/arm/kernel/entry-armv.S | 12 +++---
arch/arm/kernel/entry-common.S | 2 +-
arch/arm/kernel/entry-header.S | 8 ++--
arch/arm/lib/clear_user.S | 2 +-
arch/arm/lib/copy_page.S | 4 +-
arch/arm/lib/copy_template.S | 4 +-
arch/arm/lib/csumpartial.S | 20 ++++-----
arch/arm/lib/csumpartialcopygeneric.S | 4 +-
arch/arm/lib/csumpartialcopyuser.S | 2 +-
arch/arm/lib/div64.S | 4 +-
arch/arm/lib/floppydma.S | 10 ++---
arch/arm/lib/io-readsb.S | 20 ++++-----
arch/arm/lib/io-readsl.S | 2 +-
arch/arm/lib/io-readsw-armv3.S | 6 +--
arch/arm/lib/io-readsw-armv4.S | 12 +++---
arch/arm/lib/io-writesb.S | 20 ++++-----
arch/arm/lib/io-writesl.S | 2 +-
arch/arm/lib/io-writesw-armv3.S | 2 +-
arch/arm/lib/io-writesw-armv4.S | 6 +--
arch/arm/lib/lib1funcs.S | 4 +-
arch/arm/lib/memmove.S | 24 +++++------
arch/arm/lib/memset.S | 42 +++++++++----------
.../mach-ks8695/include/mach/entry-macro.S | 2 +-
arch/arm/mach-tegra/reset-handler.S | 2 +-
arch/arm/mm/cache-v6.S | 8 ++--
arch/arm/mm/proc-v7m.S | 4 +-
31 files changed, 124 insertions(+), 124 deletions(-)

diff --git a/arch/arm/boot/bootp/init.S b/arch/arm/boot/bootp/init.S
index 78b508075161..142927e5f485 100644
--- a/arch/arm/boot/bootp/init.S
+++ b/arch/arm/boot/bootp/init.S
@@ -44,7 +44,7 @@ _start: add lr, pc, #-0x8 @ lr = current load addr
*/
movne r10, #0 @ terminator
movne r4, #2 @ Size of this entry (2 words)
- stmneia r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator
+ stmiane r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator

/*
* find the end of the tag list, and then add an INITRD tag on the end.
diff --git a/arch/arm/boot/compressed/ll_char_wr.S b/arch/arm/boot/compressed/ll_char_wr.S
index 8517c8606b4a..b1dcdb9f4030 100644
--- a/arch/arm/boot/compressed/ll_char_wr.S
+++ b/arch/arm/boot/compressed/ll_char_wr.S
@@ -75,7 +75,7 @@ Lrow4bpplp:
tst r1, #7 @ avoid using r7 directly after
str r7, [r0, -r5]!
subne r1, r1, #1
- ldrneb r7, [r6, r1]
+ ldrbne r7, [r6, r1]
bne Lrow4bpplp
ldmfd sp!, {r4 - r7, pc}

@@ -103,7 +103,7 @@ Lrow8bpplp:
sub r0, r0, r5 @ avoid ip
stmia r0, {r4, ip}
subne r1, r1, #1
- ldrneb r7, [r6, r1]
+ ldrbne r7, [r6, r1]
bne Lrow8bpplp
ldmfd sp!, {r4 - r7, pc}

diff --git a/arch/arm/include/asm/hardware/entry-macro-iomd.S b/arch/arm/include/asm/hardware/entry-macro-iomd.S
index 8c215acd9b57..f7692731e514 100644
--- a/arch/arm/include/asm/hardware/entry-macro-iomd.S
+++ b/arch/arm/include/asm/hardware/entry-macro-iomd.S
@@ -16,25 +16,25 @@
ldr \tmp, =irq_prio_h
teq \irqstat, #0
#ifdef IOMD_BASE
- ldreqb \irqstat, [\base, #IOMD_DMAREQ] @ get dma
+ ldrbeq \irqstat, [\base, #IOMD_DMAREQ] @ get dma
addeq \tmp, \tmp, #256 @ irq_prio_h table size
teqeq \irqstat, #0
bne 2406f
#endif
- ldreqb \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
+ ldrbeq \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
addeq \tmp, \tmp, #256 @ irq_prio_d table size
teqeq \irqstat, #0
#ifdef IOMD_IRQREQC
- ldreqb \irqstat, [\base, #IOMD_IRQREQC]
+ ldrbeq \irqstat, [\base, #IOMD_IRQREQC]
addeq \tmp, \tmp, #256 @ irq_prio_l table size
teqeq \irqstat, #0
#endif
#ifdef IOMD_IRQREQD
- ldreqb \irqstat, [\base, #IOMD_IRQREQD]
+ ldrbeq \irqstat, [\base, #IOMD_IRQREQD]
addeq \tmp, \tmp, #256 @ irq_prio_lc table size
teqeq \irqstat, #0
#endif
-2406: ldrneb \irqnr, [\tmp, \irqstat] @ get IRQ number
+2406: ldrbne \irqnr, [\tmp, \irqstat] @ get IRQ number
.endm

/*
diff --git a/arch/arm/include/debug/tegra.S b/arch/arm/include/debug/tegra.S
index 3bc80599c022..4a5a645c76e2 100644
--- a/arch/arm/include/debug/tegra.S
+++ b/arch/arm/include/debug/tegra.S
@@ -173,7 +173,7 @@

.macro senduart, rd, rx
cmp \rx, #0
- strneb \rd, [\rx, #UART_TX << UART_SHIFT]
+ strbne \rd, [\rx, #UART_TX << UART_SHIFT]
1001:
.endm

diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S
index b795dc2408c0..b9f94e03d916 100644
--- a/arch/arm/kernel/debug.S
+++ b/arch/arm/kernel/debug.S
@@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - .
ENTRY(printascii)
addruart_current r3, r1, r2
1: teq r0, #0
- ldrneb r1, [r0], #1
+ ldrbne r1, [r0], #1
teqne r1, #0
reteq lr
2: teq r1, #'\n'
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index e85a3af9ddeb..ce4aea57130a 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -636,7 +636,7 @@ call_fpe:
@ Test if we need to give access to iWMMXt coprocessors
ldr r5, [r10, #TI_FLAGS]
rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only
- movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1)
+ movscs r7, r5, lsr #(TIF_USING_IWMMXT + 1)
bcs iwmmxt_task_enable
#endif
ARM( add pc, pc, r8, lsr #6 )
@@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60
smp_dmb arm
1: ldrexd r0, r1, [r2] @ load current val
eors r3, r0, r4 @ compare with oldval (1)
- eoreqs r3, r1, r5 @ compare with oldval (2)
+ eorseq r3, r1, r5 @ compare with oldval (2)
strexdeq r3, r6, r7, [r2] @ store newval if eq
teqeq r3, #1 @ success?
beq 1b @ if no then retry
@@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60
ldmia r1, {r6, lr} @ load new val
1: ldmia r2, {r0, r1} @ load current val
eors r3, r0, r4 @ compare with oldval (1)
- eoreqs r3, r1, r5 @ compare with oldval (2)
-2: stmeqia r2, {r6, lr} @ store newval if eq
+ eorseq r3, r1, r5 @ compare with oldval (2)
+2: stmiaeq r2, {r6, lr} @ store newval if eq
rsbs r0, r3, #0 @ set return val and C flag
ldmfd sp!, {r4, r5, r6, pc}

@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
mov r7, #0xffff0fff
sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
subs r8, r4, r7
- rsbcss r8, r8, #(2b - 1b)
+ rsbscs r8, r8, #(2b - 1b)
strcs r7, [sp, #S_PC]
#if __LINUX_ARM_ARCH__ < 6
bcc kuser_cmpxchg32_fixup
@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
mov r7, #0xffff0fff
sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
subs r8, r4, r7
- rsbcss r8, r8, #(2b - 1b)
+ rsbscs r8, r8, #(2b - 1b)
strcs r7, [sp, #S_PC]
ret lr
.previous
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 0465d65d23de..f7649adef505 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -373,7 +373,7 @@ sys_syscall:
movhs scno, #0
csdb
#endif
- stmloia sp, {r5, r6} @ shuffle args
+ stmialo sp, {r5, r6} @ shuffle args
movlo r0, r1
movlo r1, r2
movlo r2, r3
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
index 773424843d6e..9b718e63d912 100644
--- a/arch/arm/kernel/entry-header.S
+++ b/arch/arm/kernel/entry-header.S
@@ -387,8 +387,8 @@
badr lr, \ret @ return address
.if \reload
add r1, sp, #S_R0 + S_OFF @ pointer to regs
- ldmccia r1, {r0 - r6} @ reload r0-r6
- stmccia sp, {r4, r5} @ update stack arguments
+ ldmiacc r1, {r0 - r6} @ reload r0-r6
+ stmiacc sp, {r4, r5} @ update stack arguments
.endif
ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine
#else
@@ -396,8 +396,8 @@
badr lr, \ret @ return address
.if \reload
add r1, sp, #S_R0 + S_OFF @ pointer to regs
- ldmccia r1, {r0 - r6} @ reload r0-r6
- stmccia sp, {r4, r5} @ update stack arguments
+ ldmiacc r1, {r0 - r6} @ reload r0-r6
+ stmiacc sp, {r4, r5} @ update stack arguments
.endif
ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine
#endif
diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S
index e936352ccb00..55946e3fa2ba 100644
--- a/arch/arm/lib/clear_user.S
+++ b/arch/arm/lib/clear_user.S
@@ -44,7 +44,7 @@ UNWIND(.save {r1, lr})
strusr r2, r0, 1, ne, rept=2
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
it ne @ explicit IT needed for the label
-USER( strnebt r2, [r0])
+USER( strbtne r2, [r0])
mov r0, #0
ldmfd sp!, {r1, pc}
UNWIND(.fnend)
diff --git a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S
index 6ee2f6706f86..b84ce1792043 100644
--- a/arch/arm/lib/copy_page.S
+++ b/arch/arm/lib/copy_page.S
@@ -39,9 +39,9 @@ ENTRY(copy_page)
.endr
subs r2, r2, #1 @ 1
stmia r0!, {r3, r4, ip, lr} @ 4
- ldmgtia r1!, {r3, r4, ip, lr} @ 4
+ ldmiagt r1!, {r3, r4, ip, lr} @ 4
bgt 1b @ 1
- PLD( ldmeqia r1!, {r3, r4, ip, lr} )
+ PLD( ldmiaeq r1!, {r3, r4, ip, lr} )
PLD( beq 2b )
ldmfd sp!, {r4, pc} @ 3
ENDPROC(copy_page)
diff --git a/arch/arm/lib/copy_template.S b/arch/arm/lib/copy_template.S
index 2d54491b0e22..a11f2c25e03a 100644
--- a/arch/arm/lib/copy_template.S
+++ b/arch/arm/lib/copy_template.S
@@ -99,7 +99,7 @@

CALGN( ands ip, r0, #31 )
CALGN( rsb r3, ip, #32 )
- CALGN( sbcnes r4, r3, r2 ) @ C is always set here
+ CALGN( sbcsne r4, r3, r2 ) @ C is always set here
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, r3 ) @ C gets set
@@ -204,7 +204,7 @@

CALGN( ands ip, r0, #31 )
CALGN( rsb ip, ip, #32 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip )
CALGN( bcc 15f )

diff --git a/arch/arm/lib/csumpartial.S b/arch/arm/lib/csumpartial.S
index 984e0f29d548..bd84e2db353b 100644
--- a/arch/arm/lib/csumpartial.S
+++ b/arch/arm/lib/csumpartial.S
@@ -40,9 +40,9 @@ td3 .req lr
/* we must have at least one byte. */
tst buf, #1 @ odd address?
movne sum, sum, ror #8
- ldrneb td0, [buf], #1
+ ldrbne td0, [buf], #1
subne len, len, #1
- adcnes sum, sum, td0, put_byte_1
+ adcsne sum, sum, td0, put_byte_1

.Lless4: tst len, #6
beq .Lless8_byte
@@ -68,8 +68,8 @@ td3 .req lr
bne .Lless8_wordlp

.Lless8_byte: tst len, #1 @ odd number of bytes
- ldrneb td0, [buf], #1 @ include last byte
- adcnes sum, sum, td0, put_byte_0 @ update checksum
+ ldrbne td0, [buf], #1 @ include last byte
+ adcsne sum, sum, td0, put_byte_0 @ update checksum

.Ldone: adc r0, sum, #0 @ collect up the last carry
ldr td0, [sp], #4
@@ -78,17 +78,17 @@ td3 .req lr
ldr pc, [sp], #4 @ return

.Lnot_aligned: tst buf, #1 @ odd address
- ldrneb td0, [buf], #1 @ make even
+ ldrbne td0, [buf], #1 @ make even
subne len, len, #1
- adcnes sum, sum, td0, put_byte_1 @ update checksum
+ adcsne sum, sum, td0, put_byte_1 @ update checksum

tst buf, #2 @ 32-bit aligned?
#if __LINUX_ARM_ARCH__ >= 4
- ldrneh td0, [buf], #2 @ make 32-bit aligned
+ ldrhne td0, [buf], #2 @ make 32-bit aligned
subne len, len, #2
#else
- ldrneb td0, [buf], #1
- ldrneb ip, [buf], #1
+ ldrbne td0, [buf], #1
+ ldrbne ip, [buf], #1
subne len, len, #2
#ifndef __ARMEB__
orrne td0, td0, ip, lsl #8
@@ -96,7 +96,7 @@ td3 .req lr
orrne td0, ip, td0, lsl #8
#endif
#endif
- adcnes sum, sum, td0 @ update checksum
+ adcsne sum, sum, td0 @ update checksum
ret lr

ENTRY(csum_partial)
diff --git a/arch/arm/lib/csumpartialcopygeneric.S b/arch/arm/lib/csumpartialcopygeneric.S
index 10b45909610c..08e17758cbea 100644
--- a/arch/arm/lib/csumpartialcopygeneric.S
+++ b/arch/arm/lib/csumpartialcopygeneric.S
@@ -148,9 +148,9 @@ FN_ENTRY
strb r5, [dst], #1
mov r5, r4, get_byte_2
.Lexit: tst len, #1
- strneb r5, [dst], #1
+ strbne r5, [dst], #1
andne r5, r5, #255
- adcnes sum, sum, r5, put_byte_0
+ adcsne sum, sum, r5, put_byte_0

/*
* If the dst pointer was not 16-bit aligned, we
diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S
index b83fdc06286a..f4716d98e0b4 100644
--- a/arch/arm/lib/csumpartialcopyuser.S
+++ b/arch/arm/lib/csumpartialcopyuser.S
@@ -95,7 +95,7 @@
add r2, r2, r1
mov r0, #0 @ zero the buffer
9002: teq r2, r1
- strneb r0, [r1], #1
+ strbne r0, [r1], #1
bne 9002b
load_regs
.popsection
diff --git a/arch/arm/lib/div64.S b/arch/arm/lib/div64.S
index a9eafe4981eb..4d80f690c48b 100644
--- a/arch/arm/lib/div64.S
+++ b/arch/arm/lib/div64.S
@@ -88,8 +88,8 @@ UNWIND(.fnstart)
@ Break out early if dividend reaches 0.
2: cmp xh, yl
orrcs yh, yh, ip
- subcss xh, xh, yl
- movnes ip, ip, lsr #1
+ subscs xh, xh, yl
+ movsne ip, ip, lsr #1
mov yl, yl, lsr #1
bne 2b

diff --git a/arch/arm/lib/floppydma.S b/arch/arm/lib/floppydma.S
index 617150b1baef..de68d3b343e3 100644
--- a/arch/arm/lib/floppydma.S
+++ b/arch/arm/lib/floppydma.S
@@ -14,8 +14,8 @@
.global floppy_fiqin_end
ENTRY(floppy_fiqin_start)
subs r9, r9, #1
- ldrgtb r12, [r11, #-4]
- ldrleb r12, [r11], #0
+ ldrbgt r12, [r11, #-4]
+ ldrble r12, [r11], #0
strb r12, [r10], #1
subs pc, lr, #4
floppy_fiqin_end:
@@ -23,10 +23,10 @@ floppy_fiqin_end:
.global floppy_fiqout_end
ENTRY(floppy_fiqout_start)
subs r9, r9, #1
- ldrgeb r12, [r10], #1
+ ldrbge r12, [r10], #1
movlt r12, #0
- strleb r12, [r11], #0
- subles pc, lr, #4
+ strble r12, [r11], #0
+ subsle pc, lr, #4
strb r12, [r11, #-4]
subs pc, lr, #4
floppy_fiqout_end:
diff --git a/arch/arm/lib/io-readsb.S b/arch/arm/lib/io-readsb.S
index c31b2f3153f1..91038a0a77b5 100644
--- a/arch/arm/lib/io-readsb.S
+++ b/arch/arm/lib/io-readsb.S
@@ -16,10 +16,10 @@
cmp ip, #2
ldrb r3, [r0]
strb r3, [r1], #1
- ldrgeb r3, [r0]
- strgeb r3, [r1], #1
- ldrgtb r3, [r0]
- strgtb r3, [r1], #1
+ ldrbge r3, [r0]
+ strbge r3, [r1], #1
+ ldrbgt r3, [r0]
+ strbgt r3, [r1], #1
subs r2, r2, ip
bne .Linsb_aligned

@@ -72,7 +72,7 @@ ENTRY(__raw_readsb)
bpl .Linsb_16_lp

tst r2, #15
- ldmeqfd sp!, {r4 - r6, pc}
+ ldmfdeq sp!, {r4 - r6, pc}

.Linsb_no_16: tst r2, #8
beq .Linsb_no_8
@@ -109,15 +109,15 @@ ENTRY(__raw_readsb)
str r3, [r1], #4

.Linsb_no_4: ands r2, r2, #3
- ldmeqfd sp!, {r4 - r6, pc}
+ ldmfdeq sp!, {r4 - r6, pc}

cmp r2, #2
ldrb r3, [r0]
strb r3, [r1], #1
- ldrgeb r3, [r0]
- strgeb r3, [r1], #1
- ldrgtb r3, [r0]
- strgtb r3, [r1]
+ ldrbge r3, [r0]
+ strbge r3, [r1], #1
+ ldrbgt r3, [r0]
+ strbgt r3, [r1]

ldmfd sp!, {r4 - r6, pc}
ENDPROC(__raw_readsb)
diff --git a/arch/arm/lib/io-readsl.S b/arch/arm/lib/io-readsl.S
index 2ed86fa5465f..f2e2064318d2 100644
--- a/arch/arm/lib/io-readsl.S
+++ b/arch/arm/lib/io-readsl.S
@@ -30,7 +30,7 @@ ENTRY(__raw_readsl)
2: movs r2, r2, lsl #31
ldrcs r3, [r0, #0]
ldrcs ip, [r0, #0]
- stmcsia r1!, {r3, ip}
+ stmiacs r1!, {r3, ip}
ldrne r3, [r0, #0]
strne r3, [r1, #0]
ret lr
diff --git a/arch/arm/lib/io-readsw-armv3.S b/arch/arm/lib/io-readsw-armv3.S
index 413da9914529..8b25b69c516e 100644
--- a/arch/arm/lib/io-readsw-armv3.S
+++ b/arch/arm/lib/io-readsw-armv3.S
@@ -68,7 +68,7 @@ ENTRY(__raw_readsw)
bpl .Linsw_8_lp

tst r2, #7
- ldmeqfd sp!, {r4, r5, r6, pc}
+ ldmfdeq sp!, {r4, r5, r6, pc}

.Lno_insw_8: tst r2, #4
beq .Lno_insw_4
@@ -97,9 +97,9 @@ ENTRY(__raw_readsw)

.Lno_insw_2: tst r2, #1
ldrne r3, [r0]
- strneb r3, [r1], #1
+ strbne r3, [r1], #1
movne r3, r3, lsr #8
- strneb r3, [r1]
+ strbne r3, [r1]

ldmfd sp!, {r4, r5, r6, pc}

diff --git a/arch/arm/lib/io-readsw-armv4.S b/arch/arm/lib/io-readsw-armv4.S
index d9a45e9692ae..5efdd66f5dcd 100644
--- a/arch/arm/lib/io-readsw-armv4.S
+++ b/arch/arm/lib/io-readsw-armv4.S
@@ -76,8 +76,8 @@ ENTRY(__raw_readsw)
pack r3, r3, ip
str r3, [r1], #4

-.Lno_insw_2: ldrneh r3, [r0]
- strneh r3, [r1]
+.Lno_insw_2: ldrhne r3, [r0]
+ strhne r3, [r1]

ldmfd sp!, {r4, r5, pc}

@@ -94,7 +94,7 @@ ENTRY(__raw_readsw)
#endif

.Linsw_noalign: stmfd sp!, {r4, lr}
- ldrccb ip, [r1, #-1]!
+ ldrbcc ip, [r1, #-1]!
bcc 1f

ldrh ip, [r0]
@@ -121,11 +121,11 @@ ENTRY(__raw_readsw)

3: tst r2, #1
strb ip, [r1], #1
- ldrneh ip, [r0]
+ ldrhne ip, [r0]
_BE_ONLY_( movne ip, ip, ror #8 )
- strneb ip, [r1], #1
+ strbne ip, [r1], #1
_LE_ONLY_( movne ip, ip, lsr #8 )
_BE_ONLY_( movne ip, ip, lsr #24 )
- strneb ip, [r1]
+ strbne ip, [r1]
ldmfd sp!, {r4, pc}
ENDPROC(__raw_readsw)
diff --git a/arch/arm/lib/io-writesb.S b/arch/arm/lib/io-writesb.S
index a46bbc9b168b..7d2881a2381e 100644
--- a/arch/arm/lib/io-writesb.S
+++ b/arch/arm/lib/io-writesb.S
@@ -36,10 +36,10 @@
cmp ip, #2
ldrb r3, [r1], #1
strb r3, [r0]
- ldrgeb r3, [r1], #1
- strgeb r3, [r0]
- ldrgtb r3, [r1], #1
- strgtb r3, [r0]
+ ldrbge r3, [r1], #1
+ strbge r3, [r0]
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0]
subs r2, r2, ip
bne .Loutsb_aligned

@@ -64,7 +64,7 @@ ENTRY(__raw_writesb)
bpl .Loutsb_16_lp

tst r2, #15
- ldmeqfd sp!, {r4, r5, pc}
+ ldmfdeq sp!, {r4, r5, pc}

.Loutsb_no_16: tst r2, #8
beq .Loutsb_no_8
@@ -80,15 +80,15 @@ ENTRY(__raw_writesb)
outword r3

.Loutsb_no_4: ands r2, r2, #3
- ldmeqfd sp!, {r4, r5, pc}
+ ldmfdeq sp!, {r4, r5, pc}

cmp r2, #2
ldrb r3, [r1], #1
strb r3, [r0]
- ldrgeb r3, [r1], #1
- strgeb r3, [r0]
- ldrgtb r3, [r1]
- strgtb r3, [r0]
+ ldrbge r3, [r1], #1
+ strbge r3, [r0]
+ ldrbgt r3, [r1]
+ strbgt r3, [r0]

ldmfd sp!, {r4, r5, pc}
ENDPROC(__raw_writesb)
diff --git a/arch/arm/lib/io-writesl.S b/arch/arm/lib/io-writesl.S
index 4ea2435988c1..7596ac0c90b0 100644
--- a/arch/arm/lib/io-writesl.S
+++ b/arch/arm/lib/io-writesl.S
@@ -28,7 +28,7 @@ ENTRY(__raw_writesl)
bpl 1b
ldmfd sp!, {r4, lr}
2: movs r2, r2, lsl #31
- ldmcsia r1!, {r3, ip}
+ ldmiacs r1!, {r3, ip}
strcs r3, [r0, #0]
ldrne r3, [r1, #0]
strcs ip, [r0, #0]
diff --git a/arch/arm/lib/io-writesw-armv3.S b/arch/arm/lib/io-writesw-armv3.S
index 121789eb6802..cb94b9b49405 100644
--- a/arch/arm/lib/io-writesw-armv3.S
+++ b/arch/arm/lib/io-writesw-armv3.S
@@ -79,7 +79,7 @@ ENTRY(__raw_writesw)
bpl .Loutsw_8_lp

tst r2, #7
- ldmeqfd sp!, {r4, r5, r6, pc}
+ ldmfdeq sp!, {r4, r5, r6, pc}

.Lno_outsw_8: tst r2, #4
beq .Lno_outsw_4
diff --git a/arch/arm/lib/io-writesw-armv4.S b/arch/arm/lib/io-writesw-armv4.S
index 269f90c51ad2..e6645b2f249e 100644
--- a/arch/arm/lib/io-writesw-armv4.S
+++ b/arch/arm/lib/io-writesw-armv4.S
@@ -61,8 +61,8 @@ ENTRY(__raw_writesw)
ldr r3, [r1], #4
outword r3

-.Lno_outsw_2: ldrneh r3, [r1]
- strneh r3, [r0]
+.Lno_outsw_2: ldrhne r3, [r1]
+ strhne r3, [r0]

ldmfd sp!, {r4, r5, pc}

@@ -95,6 +95,6 @@ ENTRY(__raw_writesw)

tst r2, #1
3: movne ip, r3, lsr #8
- strneh ip, [r0]
+ strhne ip, [r0]
ret lr
ENDPROC(__raw_writesw)
diff --git a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S
index 9397b2e532af..c23f9d9e2970 100644
--- a/arch/arm/lib/lib1funcs.S
+++ b/arch/arm/lib/lib1funcs.S
@@ -96,7 +96,7 @@ Boston, MA 02111-1307, USA. */
subhs \dividend, \dividend, \divisor, lsr #3
orrhs \result, \result, \curbit, lsr #3
cmp \dividend, #0 @ Early termination?
- movnes \curbit, \curbit, lsr #4 @ No, any more bits to do?
+ movsne \curbit, \curbit, lsr #4 @ No, any more bits to do?
movne \divisor, \divisor, lsr #4
bne 1b

@@ -182,7 +182,7 @@ Boston, MA 02111-1307, USA. */
subhs \dividend, \dividend, \divisor, lsr #3
cmp \dividend, #1
mov \divisor, \divisor, lsr #4
- subges \order, \order, #4
+ subsge \order, \order, #4
bge 1b

tst \order, #3
diff --git a/arch/arm/lib/memmove.S b/arch/arm/lib/memmove.S
index 69a9d47fc5ab..d70304cb2cd0 100644
--- a/arch/arm/lib/memmove.S
+++ b/arch/arm/lib/memmove.S
@@ -59,7 +59,7 @@ ENTRY(memmove)
blt 5f

CALGN( ands ip, r0, #31 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, ip ) @ C is set here
@@ -114,20 +114,20 @@ ENTRY(memmove)
UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block

8: movs r2, r2, lsl #31
- ldrneb r3, [r1, #-1]!
- ldrcsb r4, [r1, #-1]!
- ldrcsb ip, [r1, #-1]
- strneb r3, [r0, #-1]!
- strcsb r4, [r0, #-1]!
- strcsb ip, [r0, #-1]
+ ldrbne r3, [r1, #-1]!
+ ldrbcs r4, [r1, #-1]!
+ ldrbcs ip, [r1, #-1]
+ strbne r3, [r0, #-1]!
+ strbcs r4, [r0, #-1]!
+ strbcs ip, [r0, #-1]
ldmfd sp!, {r0, r4, pc}

9: cmp ip, #2
- ldrgtb r3, [r1, #-1]!
- ldrgeb r4, [r1, #-1]!
+ ldrbgt r3, [r1, #-1]!
+ ldrbge r4, [r1, #-1]!
ldrb lr, [r1, #-1]!
- strgtb r3, [r0, #-1]!
- strgeb r4, [r0, #-1]!
+ strbgt r3, [r0, #-1]!
+ strbge r4, [r0, #-1]!
subs r2, r2, ip
strb lr, [r0, #-1]!
blt 8b
@@ -150,7 +150,7 @@ ENTRY(memmove)
blt 14f

CALGN( ands ip, r0, #31 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip )
CALGN( bcc 15f )

diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
index ed6d35d9cdb5..5593a45e0a8c 100644
--- a/arch/arm/lib/memset.S
+++ b/arch/arm/lib/memset.S
@@ -44,20 +44,20 @@ UNWIND( .save {r8, lr} )
mov lr, r3

2: subs r2, r2, #64
- stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
- stmgeia ip!, {r1, r3, r8, lr}
- stmgeia ip!, {r1, r3, r8, lr}
- stmgeia ip!, {r1, r3, r8, lr}
+ stmiage ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
+ stmiage ip!, {r1, r3, r8, lr}
+ stmiage ip!, {r1, r3, r8, lr}
+ stmiage ip!, {r1, r3, r8, lr}
bgt 2b
- ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go.
+ ldmfdeq sp!, {r8, pc} @ Now <64 bytes to go.
/*
* No need to correct the count; we're only testing bits from now on
*/
tst r2, #32
- stmneia ip!, {r1, r3, r8, lr}
- stmneia ip!, {r1, r3, r8, lr}
+ stmiane ip!, {r1, r3, r8, lr}
+ stmiane ip!, {r1, r3, r8, lr}
tst r2, #16
- stmneia ip!, {r1, r3, r8, lr}
+ stmiane ip!, {r1, r3, r8, lr}
ldmfd sp!, {r8, lr}
UNWIND( .fnend )

@@ -87,22 +87,22 @@ UNWIND( .save {r4-r8, lr} )
rsb r8, r8, #32
sub r2, r2, r8
movs r8, r8, lsl #(32 - 4)
- stmcsia ip!, {r4, r5, r6, r7}
- stmmiia ip!, {r4, r5}
+ stmiacs ip!, {r4, r5, r6, r7}
+ stmiami ip!, {r4, r5}
tst r8, #(1 << 30)
mov r8, r1
strne r1, [ip], #4

3: subs r2, r2, #64
- stmgeia ip!, {r1, r3-r8, lr}
- stmgeia ip!, {r1, r3-r8, lr}
+ stmiage ip!, {r1, r3-r8, lr}
+ stmiage ip!, {r1, r3-r8, lr}
bgt 3b
- ldmeqfd sp!, {r4-r8, pc}
+ ldmfdeq sp!, {r4-r8, pc}

tst r2, #32
- stmneia ip!, {r1, r3-r8, lr}
+ stmiane ip!, {r1, r3-r8, lr}
tst r2, #16
- stmneia ip!, {r4-r7}
+ stmiane ip!, {r4-r7}
ldmfd sp!, {r4-r8, lr}
UNWIND( .fnend )

@@ -110,7 +110,7 @@ UNWIND( .fnend )

UNWIND( .fnstart )
4: tst r2, #8
- stmneia ip!, {r1, r3}
+ stmiane ip!, {r1, r3}
tst r2, #4
strne r1, [ip], #4
/*
@@ -118,17 +118,17 @@ UNWIND( .fnstart )
* may have an unaligned pointer as well.
*/
5: tst r2, #2
- strneb r1, [ip], #1
- strneb r1, [ip], #1
+ strbne r1, [ip], #1
+ strbne r1, [ip], #1
tst r2, #1
- strneb r1, [ip], #1
+ strbne r1, [ip], #1
ret lr

6: subs r2, r2, #4 @ 1 do we have enough
blt 5b @ 1 bytes to align with?
cmp r3, #2 @ 1
- strltb r1, [ip], #1 @ 1
- strleb r1, [ip], #1 @ 1
+ strblt r1, [ip], #1 @ 1
+ strble r1, [ip], #1 @ 1
strb r1, [ip], #1 @ 1
add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
b 1b
diff --git a/arch/arm/mach-ks8695/include/mach/entry-macro.S b/arch/arm/mach-ks8695/include/mach/entry-macro.S
index 8315b34f32ff..7ff812cb010b 100644
--- a/arch/arm/mach-ks8695/include/mach/entry-macro.S
+++ b/arch/arm/mach-ks8695/include/mach/entry-macro.S
@@ -42,6 +42,6 @@
moveq \irqstat, \irqstat, lsr #2
addeq \irqnr, \irqnr, #2
tst \irqstat, #0x01
- addeqs \irqnr, \irqnr, #1
+ addseq \irqnr, \irqnr, #1
1001:
.endm
diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S
index 805f306fa6f7..e22ccf87eded 100644
--- a/arch/arm/mach-tegra/reset-handler.S
+++ b/arch/arm/mach-tegra/reset-handler.S
@@ -172,7 +172,7 @@ after_errata:
mov32 r5, TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET
mov r0, #CPU_NOT_RESETTABLE
cmp r10, #0
- strneb r0, [r5, #__tegra20_cpu1_resettable_status_offset]
+ strbne r0, [r5, #__tegra20_cpu1_resettable_status_offset]
1:
#endif

diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S
index 24659952c278..be68d62566c7 100644
--- a/arch/arm/mm/cache-v6.S
+++ b/arch/arm/mm/cache-v6.S
@@ -215,8 +215,8 @@ v6_dma_inv_range:
#endif
tst r1, #D_CACHE_LINE_SIZE - 1
#ifdef CONFIG_DMA_CACHE_RWFO
- ldrneb r2, [r1, #-1] @ read for ownership
- strneb r2, [r1, #-1] @ write for ownership
+ ldrbne r2, [r1, #-1] @ read for ownership
+ strbne r2, [r1, #-1] @ write for ownership
#endif
bic r1, r1, #D_CACHE_LINE_SIZE - 1
#ifdef HARVARD_CACHE
@@ -284,8 +284,8 @@ ENTRY(v6_dma_flush_range)
add r0, r0, #D_CACHE_LINE_SIZE
cmp r0, r1
#ifdef CONFIG_DMA_CACHE_RWFO
- ldrlob r2, [r0] @ read for ownership
- strlob r2, [r0] @ write for ownership
+ ldrblo r2, [r0] @ read for ownership
+ strblo r2, [r0] @ write for ownership
#endif
blo 1b
mov r0, #0
diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S
index 47a5acc64433..0deaf13e5e34 100644
--- a/arch/arm/mm/proc-v7m.S
+++ b/arch/arm/mm/proc-v7m.S
@@ -149,10 +149,10 @@ __v7m_setup_cont:

@ Configure caches (if implemented)
teq r8, #0
- stmneia sp, {r0-r6, lr} @ v7m_invalidate_l1 touches r0-r6
+ stmiane sp, {r0-r6, lr} @ v7m_invalidate_l1 touches r0-r6
blne v7m_invalidate_l1
teq r8, #0 @ re-evalutae condition
- ldmneia sp, {r0-r6, lr}
+ ldmiane sp, {r0-r6, lr}

@ Configure the System Control Register to ensure 8-byte stack alignment
@ Note the STKALIGN bit is either RW or RAO.
--
2.20.1


2019-02-07 09:47:34

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 2/5] ARM: use unified assembler in headers

Use unified assembler syntax (UAL) in headers. Divided syntax is
considered depricated. This will also allow to build the kernel
using LLVM's integrated assembler.

Signed-off-by: Stefan Agner <[email protected]>
---
arch/arm/include/asm/assembler.h | 8 ++++----
arch/arm/include/asm/vfpmacros.h | 8 ++++----
arch/arm/lib/bitops.h | 8 ++++----
3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 28a48e0d4cca..60465b55683c 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -376,7 +376,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
9999:
.if \inc == 1
- \instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
+ \instr\()b\cond\()\t\().w \reg, [\ptr, #\off]
.elseif \inc == 4
\instr\cond\()\t\().w \reg, [\ptr, #\off]
.else
@@ -417,7 +417,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.rept \rept
9999:
.if \inc == 1
- \instr\cond\()b\()\t \reg, [\ptr], #\inc
+ \instr\()b\cond\()\t \reg, [\ptr], #\inc
.elseif \inc == 4
\instr\cond\()\t \reg, [\ptr], #\inc
.else
@@ -460,7 +460,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
#ifndef CONFIG_CPU_USE_DOMAINS
adds \tmp, \addr, #\size - 1
- sbcccs \tmp, \tmp, \limit
+ sbcscc \tmp, \tmp, \limit
bcs \bad
#ifdef CONFIG_CPU_SPECTRE
movcs \addr, #0
@@ -474,7 +474,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
sub \tmp, \limit, #1
subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
- subhss \tmp, \tmp, \size @ tmp = limit - (addr + size) }
+ subshs \tmp, \tmp, \size @ tmp = limit - (addr + size) }
movlo \addr, #0 @ if (tmp < 0) addr = NULL
csdb
#endif
diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h
index ef5dfedacd8d..628c336e8e3b 100644
--- a/arch/arm/include/asm/vfpmacros.h
+++ b/arch/arm/include/asm/vfpmacros.h
@@ -29,13 +29,13 @@
ldr \tmp, =elf_hwcap @ may not have MVFR regs
ldr \tmp, [\tmp, #0]
tst \tmp, #HWCAP_VFPD32
- ldcnel p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
+ ldclne p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
addeq \base, \base, #32*4 @ step over unused register space
#else
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers?
- ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
+ ldcleq p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space
#endif
#endif
@@ -53,13 +53,13 @@
ldr \tmp, =elf_hwcap @ may not have MVFR regs
ldr \tmp, [\tmp, #0]
tst \tmp, #HWCAP_VFPD32
- stcnel p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
+ stclne p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
addeq \base, \base, #32*4 @ step over unused register space
#else
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers?
- stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
+ stcleq p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space
#endif
#endif
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h
index 93cddab73072..95bd35991288 100644
--- a/arch/arm/lib/bitops.h
+++ b/arch/arm/lib/bitops.h
@@ -7,7 +7,7 @@
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
- strneb r1, [ip] @ assert word-aligned
+ strbne r1, [ip] @ assert word-aligned
mov r2, #1
and r3, r0, #31 @ Get bit offset
mov r0, r0, lsr #5
@@ -32,7 +32,7 @@ ENDPROC(\name )
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
- strneb r1, [ip] @ assert word-aligned
+ strbne r1, [ip] @ assert word-aligned
mov r2, #1
and r3, r0, #31 @ Get bit offset
mov r0, r0, lsr #5
@@ -62,7 +62,7 @@ ENDPROC(\name )
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
- strneb r1, [ip] @ assert word-aligned
+ strbne r1, [ip] @ assert word-aligned
and r2, r0, #31
mov r0, r0, lsr #5
mov r3, #1
@@ -89,7 +89,7 @@ ENDPROC(\name )
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
- strneb r1, [ip] @ assert word-aligned
+ strbne r1, [ip] @ assert word-aligned
and r3, r0, #31
mov r0, r0, lsr #5
save_and_disable_irqs ip
--
2.20.1


2019-02-07 09:47:43

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 5/5] ARM: warn if divided syntax assembler is used

Remove the -mno-warn-deprecated assembler flag to make sure the GNU
assembler warns in case non-unified syntax is used.

Signed-off-by: Stefan Agner <[email protected]>
---
arch/arm/Makefile | 3 ---
1 file changed, 3 deletions(-)

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index a0d08a3c9d33..811498e16673 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -112,9 +112,6 @@ ifeq ($(CONFIG_ARM_UNWIND),y)
CFLAGS_ABI +=-funwind-tables
endif

-# Accept old syntax despite ".syntax unified"
-AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
-
ifeq ($(CONFIG_THUMB2_KERNEL),y)
AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it)
CFLAGS_ISA :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
--
2.20.1


2019-02-07 09:48:40

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 4/5] ARM: use unified assembler in c files

Use unified assembler syntax (UAL) in inline assembler. Divided
syntax is considered depricated. This will also allow to build
the kernel using LLVM's integrated assembler.

Signed-off-by: Stefan Agner <[email protected]>
---
arch/arm/mm/copypage-v4mc.c | 2 +-
arch/arm/mm/copypage-v4wb.c | 2 +-
arch/arm/mm/copypage-v4wt.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
index b03202cddddb..b19c7ad1a6de 100644
--- a/arch/arm/mm/copypage-v4mc.c
+++ b/arch/arm/mm/copypage-v4mc.c
@@ -56,7 +56,7 @@ static void mc_copy_user_page(void *from, void *to)
ldmia %0!, {r2, r3, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\
stmia %1!, {r2, r3, ip, lr} @ 4\n\
- ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
+ ldmiane %0!, {r2, r3, ip, lr} @ 4\n\
bne 1b @ "
: "+&r" (from), "+&r" (to), "=&r" (tmp)
: "2" (PAGE_SIZE / 64)
diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
index cd3e165afeed..6e3c9b69dd25 100644
--- a/arch/arm/mm/copypage-v4wb.c
+++ b/arch/arm/mm/copypage-v4wb.c
@@ -38,7 +38,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\
stmia %0!, {r3, r4, ip, lr} @ 4\n\
- ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
+ ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
bne 1b @ 1\n\
mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
: "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
index 8614572e1296..4a40fa1cbc2a 100644
--- a/arch/arm/mm/copypage-v4wt.c
+++ b/arch/arm/mm/copypage-v4wt.c
@@ -34,7 +34,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\
stmia %0!, {r3, r4, ip, lr} @ 4\n\
- ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
+ ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
bne 1b @ 1\n\
mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
: "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
--
2.20.1


2019-02-07 09:49:30

by Stefan Agner

[permalink] [raw]
Subject: [PATCH 1/5] ARM: use unified assembler in macros

Use unified assembler syntax (UAL) in macros. Divided syntax is
considered depricated. This will also allow to build the kernel
using LLVM's integrated assembler.

Signed-off-by: Stefan Agner <[email protected]>
---
arch/arm/lib/copy_from_user.S | 2 +-
arch/arm/lib/copy_to_user.S | 2 +-
arch/arm/lib/memcpy.S | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S
index 0d4c189c7f4f..712ca399f559 100644
--- a/arch/arm/lib/copy_from_user.S
+++ b/arch/arm/lib/copy_from_user.S
@@ -91,7 +91,7 @@
.endm

.macro str1b ptr reg cond=al abort
- str\cond\()b \reg, [\ptr], #1
+ strb\cond\() \reg, [\ptr], #1
.endm

.macro enter reg1 reg2
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S
index 97a6ff4b7e3c..2e402b815e13 100644
--- a/arch/arm/lib/copy_to_user.S
+++ b/arch/arm/lib/copy_to_user.S
@@ -49,7 +49,7 @@
.endm

.macro ldr1b ptr reg cond=al abort
- ldr\cond\()b \reg, [\ptr], #1
+ ldrb\cond\() \reg, [\ptr], #1
.endm

#ifdef CONFIG_CPU_USE_DOMAINS
diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
index 64111bd4440b..1c9e625148ca 100644
--- a/arch/arm/lib/memcpy.S
+++ b/arch/arm/lib/memcpy.S
@@ -30,7 +30,7 @@
.endm

.macro ldr1b ptr reg cond=al abort
- ldr\cond\()b \reg, [\ptr], #1
+ ldrb\cond\() \reg, [\ptr], #1
.endm

.macro str1w ptr reg abort
@@ -42,7 +42,7 @@
.endm

.macro str1b ptr reg cond=al abort
- str\cond\()b \reg, [\ptr], #1
+ strb\cond\() \reg, [\ptr], #1
.endm

.macro enter reg1 reg2
--
2.20.1


2019-02-07 13:59:40

by Ard Biesheuvel

[permalink] [raw]
Subject: Re: [PATCH 1/5] ARM: use unified assembler in macros

Hi Stefan,

On Thu, 7 Feb 2019 at 10:46, Stefan Agner <[email protected]> wrote:
>
> Use unified assembler syntax (UAL) in macros. Divided syntax is
> considered depricated.

'deprecated'

> This will also allow to build the kernel
> using LLVM's integrated assembler.
>
> Signed-off-by: Stefan Agner <[email protected]>
> ---
> arch/arm/lib/copy_from_user.S | 2 +-
> arch/arm/lib/copy_to_user.S | 2 +-
> arch/arm/lib/memcpy.S | 4 ++--
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S
> index 0d4c189c7f4f..712ca399f559 100644
> --- a/arch/arm/lib/copy_from_user.S
> +++ b/arch/arm/lib/copy_from_user.S
> @@ -91,7 +91,7 @@
> .endm
>
> .macro str1b ptr reg cond=al abort
> - str\cond\()b \reg, [\ptr], #1
> + strb\cond\() \reg, [\ptr], #1

You can drop the null token here, you only need that in the middle of
a word. Same below.


> .endm
>
> .macro enter reg1 reg2
> diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S
> index 97a6ff4b7e3c..2e402b815e13 100644
> --- a/arch/arm/lib/copy_to_user.S
> +++ b/arch/arm/lib/copy_to_user.S
> @@ -49,7 +49,7 @@
> .endm
>
> .macro ldr1b ptr reg cond=al abort
> - ldr\cond\()b \reg, [\ptr], #1
> + ldrb\cond\() \reg, [\ptr], #1
> .endm
>
> #ifdef CONFIG_CPU_USE_DOMAINS
> diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
> index 64111bd4440b..1c9e625148ca 100644
> --- a/arch/arm/lib/memcpy.S
> +++ b/arch/arm/lib/memcpy.S
> @@ -30,7 +30,7 @@
> .endm
>
> .macro ldr1b ptr reg cond=al abort
> - ldr\cond\()b \reg, [\ptr], #1
> + ldrb\cond\() \reg, [\ptr], #1
> .endm
>
> .macro str1w ptr reg abort
> @@ -42,7 +42,7 @@
> .endm
>
> .macro str1b ptr reg cond=al abort
> - str\cond\()b \reg, [\ptr], #1
> + strb\cond\() \reg, [\ptr], #1
> .endm
>
> .macro enter reg1 reg2
> --
> 2.20.1
>

2019-02-07 15:54:10

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH 1/5] ARM: use unified assembler in macros

On Thu, 7 Feb 2019, Stefan Agner wrote:

> Use unified assembler syntax (UAL) in macros. Divided syntax is
> considered depricated. This will also allow to build the kernel
> using LLVM's integrated assembler.
>
> Signed-off-by: Stefan Agner <[email protected]>
> ---
> arch/arm/lib/copy_from_user.S | 2 +-
> arch/arm/lib/copy_to_user.S | 2 +-
> arch/arm/lib/memcpy.S | 4 ++--
> 3 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S
> index 0d4c189c7f4f..712ca399f559 100644
> --- a/arch/arm/lib/copy_from_user.S
> +++ b/arch/arm/lib/copy_from_user.S
> @@ -91,7 +91,7 @@
> .endm
>
> .macro str1b ptr reg cond=al abort
> - str\cond\()b \reg, [\ptr], #1
> + strb\cond\() \reg, [\ptr], #1

You don't need the \() any longer. This was used simply to separate the
b suffix from the cond parameter name.


Nicolas

2019-02-07 16:12:07

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH 2/5] ARM: use unified assembler in headers

On Thu, 7 Feb 2019, Stefan Agner wrote:

> Use unified assembler syntax (UAL) in headers. Divided syntax is
> considered depricated. This will also allow to build the kernel
> using LLVM's integrated assembler.
>
> Signed-off-by: Stefan Agner <[email protected]>
> ---
> arch/arm/include/asm/assembler.h | 8 ++++----
> arch/arm/include/asm/vfpmacros.h | 8 ++++----
> arch/arm/lib/bitops.h | 8 ++++----
> 3 files changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 28a48e0d4cca..60465b55683c 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -376,7 +376,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
> .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
> 9999:
> .if \inc == 1
> - \instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
> + \instr\()b\cond\()\t\().w \reg, [\ptr, #\off]

Similar comment here: you added a \() between \instr and b as needed,
but the one between \cond and \t (which was already redundant before)
may go.


Nicolas

2019-02-07 20:53:15

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH 5/5] ARM: warn if divided syntax assembler is used

On Thu, Feb 7, 2019 at 1:46 AM Stefan Agner <[email protected]> wrote:
>
> Remove the -mno-warn-deprecated assembler flag to make sure the GNU
> assembler warns in case non-unified syntax is used.
>
> Signed-off-by: Stefan Agner <[email protected]>

Good idea, thanks for unifying the syntax.

> ---
> arch/arm/Makefile | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index a0d08a3c9d33..811498e16673 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -112,9 +112,6 @@ ifeq ($(CONFIG_ARM_UNWIND),y)
> CFLAGS_ABI +=-funwind-tables
> endif
>
> -# Accept old syntax despite ".syntax unified"
> -AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
> -

Shouldn't you also remove the references to the now gone AFLAGS_NOWARN
on lines 120 AND 127?

> ifeq ($(CONFIG_THUMB2_KERNEL),y)
> AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it)
> CFLAGS_ISA :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
> --
> 2.20.1
>


--
Thanks,
~Nick Desaulniers

2019-02-09 17:30:03

by Stefan Agner

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: use unified assembler in c files

Thanks for the reviews so far.

During some more testing I stumbled upon another issue:

On 07.02.2019 10:48, Stefan Agner wrote:
> Use unified assembler syntax (UAL) in inline assembler. Divided
> syntax is considered depricated. This will also allow to build
> the kernel using LLVM's integrated assembler.
>
> Signed-off-by: Stefan Agner <[email protected]>
> ---
> arch/arm/mm/copypage-v4mc.c | 2 +-
> arch/arm/mm/copypage-v4wb.c | 2 +-
> arch/arm/mm/copypage-v4wt.c | 2 +-
> 3 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
> index b03202cddddb..b19c7ad1a6de 100644
> --- a/arch/arm/mm/copypage-v4mc.c
> +++ b/arch/arm/mm/copypage-v4mc.c
> @@ -56,7 +56,7 @@ static void mc_copy_user_page(void *from, void *to)
> ldmia %0!, {r2, r3, ip, lr} @ 4\n\
> subs %2, %2, #1 @ 1\n\
> stmia %1!, {r2, r3, ip, lr} @ 4\n\
> - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
> + ldmiane %0!, {r2, r3, ip, lr} @ 4\n\
> bne 1b @ "
> : "+&r" (from), "+&r" (to), "=&r" (tmp)
> : "2" (PAGE_SIZE / 64)
> diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
> index cd3e165afeed..6e3c9b69dd25 100644
> --- a/arch/arm/mm/copypage-v4wb.c
> +++ b/arch/arm/mm/copypage-v4wb.c
> @@ -38,7 +38,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
> ldmia %1!, {r3, r4, ip, lr} @ 4\n\
> subs %2, %2, #1 @ 1\n\
> stmia %0!, {r3, r4, ip, lr} @ 4\n\
> - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
> + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
> bne 1b @ 1\n\
> mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
> : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
> diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
> index 8614572e1296..4a40fa1cbc2a 100644
> --- a/arch/arm/mm/copypage-v4wt.c
> +++ b/arch/arm/mm/copypage-v4wt.c
> @@ -34,7 +34,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
> ldmia %1!, {r3, r4, ip, lr} @ 4\n\
> subs %2, %2, #1 @ 1\n\
> stmia %0!, {r3, r4, ip, lr} @ 4\n\
> - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
> + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
> bne 1b @ 1\n\
> mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
> : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)

When compiling with gcc, this leads to:

/tmp/ccrvA1wy.s: Assembler messages:
/tmp/ccrvA1wy.s:180: Error: bad instruction `ldmiane r0!,{r3,r4,ip,lr}'
make[1]: *** [scripts/Makefile.build:277: arch/arm/mm/copypage-v4wb.o]
Error 1
make: *** [Makefile:1042: arch/arm/mm] Error 2

Unfortunately, the gcc option -masm-syntax-unified which allows unified
syntax in inline assembly is broken (see also
https://lkml.org/lkml/2019/1/7/1320).

So this requires to sprinkle those inline assembly with ".syntax
unified" strings, similar to how I've done it in uaccess.h.

--
Stefan

2019-02-09 22:56:23

by Stefan Agner

[permalink] [raw]
Subject: Re: [PATCH 2/5] ARM: use unified assembler in headers

On 07.02.2019 17:10, Nicolas Pitre wrote:
> On Thu, 7 Feb 2019, Stefan Agner wrote:
>
>> Use unified assembler syntax (UAL) in headers. Divided syntax is
>> considered depricated. This will also allow to build the kernel
>> using LLVM's integrated assembler.
>>
>> Signed-off-by: Stefan Agner <[email protected]>
>> ---
>> arch/arm/include/asm/assembler.h | 8 ++++----
>> arch/arm/include/asm/vfpmacros.h | 8 ++++----
>> arch/arm/lib/bitops.h | 8 ++++----
>> 3 files changed, 12 insertions(+), 12 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
>> index 28a48e0d4cca..60465b55683c 100644
>> --- a/arch/arm/include/asm/assembler.h
>> +++ b/arch/arm/include/asm/assembler.h
>> @@ -376,7 +376,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
>> .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
>> 9999:
>> .if \inc == 1
>> - \instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
>> + \instr\()b\cond\()\t\().w \reg, [\ptr, #\off]
>
> Similar comment here: you added a \() between \instr and b as needed,
> but the one between \cond and \t (which was already redundant before)
> may go.

Thanks, Nicolas, fixed this.

Also noticed that the else branch has such a null token in excess.

Furthermore, the "t" token actually needs to be before the condition
token too. It should look something like this in the end:

.if \inc == 1
\instr\()b\t\cond\().w \reg, [\ptr, #\off]
.elseif \inc == 4
\instr\t\cond\().w \reg, [\ptr, #\off]
.else
...

--
Stefan

2019-02-11 20:36:53

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: use unified assembler in c files

On Sat, Feb 9, 2019 at 9:28 AM Stefan Agner <[email protected]> wrote:
>
> Thanks for the reviews so far.
>
> During some more testing I stumbled upon another issue:
>
> On 07.02.2019 10:48, Stefan Agner wrote:
> > Use unified assembler syntax (UAL) in inline assembler. Divided
> > syntax is considered depricated. This will also allow to build
> > the kernel using LLVM's integrated assembler.
> >
> > Signed-off-by: Stefan Agner <[email protected]>
> > ---
> > arch/arm/mm/copypage-v4mc.c | 2 +-
> > arch/arm/mm/copypage-v4wb.c | 2 +-
> > arch/arm/mm/copypage-v4wt.c | 2 +-
> > 3 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
> > index b03202cddddb..b19c7ad1a6de 100644
> > --- a/arch/arm/mm/copypage-v4mc.c
> > +++ b/arch/arm/mm/copypage-v4mc.c
> > @@ -56,7 +56,7 @@ static void mc_copy_user_page(void *from, void *to)
> > ldmia %0!, {r2, r3, ip, lr} @ 4\n\
> > subs %2, %2, #1 @ 1\n\
> > stmia %1!, {r2, r3, ip, lr} @ 4\n\
> > - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
> > + ldmiane %0!, {r2, r3, ip, lr} @ 4\n\
> > bne 1b @ "
> > : "+&r" (from), "+&r" (to), "=&r" (tmp)
> > : "2" (PAGE_SIZE / 64)
> > diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
> > index cd3e165afeed..6e3c9b69dd25 100644
> > --- a/arch/arm/mm/copypage-v4wb.c
> > +++ b/arch/arm/mm/copypage-v4wb.c
> > @@ -38,7 +38,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
> > ldmia %1!, {r3, r4, ip, lr} @ 4\n\
> > subs %2, %2, #1 @ 1\n\
> > stmia %0!, {r3, r4, ip, lr} @ 4\n\
> > - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
> > + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
> > bne 1b @ 1\n\
> > mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
> > : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
> > diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
> > index 8614572e1296..4a40fa1cbc2a 100644
> > --- a/arch/arm/mm/copypage-v4wt.c
> > +++ b/arch/arm/mm/copypage-v4wt.c
> > @@ -34,7 +34,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
> > ldmia %1!, {r3, r4, ip, lr} @ 4\n\
> > subs %2, %2, #1 @ 1\n\
> > stmia %0!, {r3, r4, ip, lr} @ 4\n\
> > - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
> > + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
> > bne 1b @ 1\n\
> > mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
> > : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
>
> When compiling with gcc, this leads to:
>
> /tmp/ccrvA1wy.s: Assembler messages:
> /tmp/ccrvA1wy.s:180: Error: bad instruction `ldmiane r0!,{r3,r4,ip,lr}'
> make[1]: *** [scripts/Makefile.build:277: arch/arm/mm/copypage-v4wb.o]
> Error 1
> make: *** [Makefile:1042: arch/arm/mm] Error 2
>
> Unfortunately, the gcc option -masm-syntax-unified which allows unified
> syntax in inline assembly is broken (see also
> https://lkml.org/lkml/2019/1/7/1320).
>
> So this requires to sprinkle those inline assembly with ".syntax
> unified" strings, similar to how I've done it in uaccess.h.

Not sure if this is purely a bug in GCC; Clang treats inline asm
statements as unique, so asm directives do not carry over from one
inline asm statement to another. This has caused issues in other
arch's inline assembly, where we need to repeat asm directives
repeatedly for each inline asm statement.
https://bugs.llvm.org/show_bug.cgi?id=19749

--
Thanks,
~Nick Desaulniers

2019-02-12 20:05:36

by Stefan Agner

[permalink] [raw]
Subject: Re: [PATCH 4/5] ARM: use unified assembler in c files

On 11.02.2019 19:17, Nick Desaulniers wrote:
> On Sat, Feb 9, 2019 at 9:28 AM Stefan Agner <[email protected]> wrote:
>>
>> Thanks for the reviews so far.
>>
>> During some more testing I stumbled upon another issue:
>>
>> On 07.02.2019 10:48, Stefan Agner wrote:
>> > Use unified assembler syntax (UAL) in inline assembler. Divided
>> > syntax is considered depricated. This will also allow to build
>> > the kernel using LLVM's integrated assembler.
>> >
>> > Signed-off-by: Stefan Agner <[email protected]>
>> > ---
>> > arch/arm/mm/copypage-v4mc.c | 2 +-
>> > arch/arm/mm/copypage-v4wb.c | 2 +-
>> > arch/arm/mm/copypage-v4wt.c | 2 +-
>> > 3 files changed, 3 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
>> > index b03202cddddb..b19c7ad1a6de 100644
>> > --- a/arch/arm/mm/copypage-v4mc.c
>> > +++ b/arch/arm/mm/copypage-v4mc.c
>> > @@ -56,7 +56,7 @@ static void mc_copy_user_page(void *from, void *to)
>> > ldmia %0!, {r2, r3, ip, lr} @ 4\n\
>> > subs %2, %2, #1 @ 1\n\
>> > stmia %1!, {r2, r3, ip, lr} @ 4\n\
>> > - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
>> > + ldmiane %0!, {r2, r3, ip, lr} @ 4\n\
>> > bne 1b @ "
>> > : "+&r" (from), "+&r" (to), "=&r" (tmp)
>> > : "2" (PAGE_SIZE / 64)
>> > diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
>> > index cd3e165afeed..6e3c9b69dd25 100644
>> > --- a/arch/arm/mm/copypage-v4wb.c
>> > +++ b/arch/arm/mm/copypage-v4wb.c
>> > @@ -38,7 +38,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
>> > ldmia %1!, {r3, r4, ip, lr} @ 4\n\
>> > subs %2, %2, #1 @ 1\n\
>> > stmia %0!, {r3, r4, ip, lr} @ 4\n\
>> > - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
>> > + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
>> > bne 1b @ 1\n\
>> > mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
>> > : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
>> > diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
>> > index 8614572e1296..4a40fa1cbc2a 100644
>> > --- a/arch/arm/mm/copypage-v4wt.c
>> > +++ b/arch/arm/mm/copypage-v4wt.c
>> > @@ -34,7 +34,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
>> > ldmia %1!, {r3, r4, ip, lr} @ 4\n\
>> > subs %2, %2, #1 @ 1\n\
>> > stmia %0!, {r3, r4, ip, lr} @ 4\n\
>> > - ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
>> > + ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
>> > bne 1b @ 1\n\
>> > mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
>> > : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
>>
>> When compiling with gcc, this leads to:
>>
>> /tmp/ccrvA1wy.s: Assembler messages:
>> /tmp/ccrvA1wy.s:180: Error: bad instruction `ldmiane r0!,{r3,r4,ip,lr}'
>> make[1]: *** [scripts/Makefile.build:277: arch/arm/mm/copypage-v4wb.o]
>> Error 1
>> make: *** [Makefile:1042: arch/arm/mm] Error 2
>>
>> Unfortunately, the gcc option -masm-syntax-unified which allows unified
>> syntax in inline assembly is broken (see also
>> https://lkml.org/lkml/2019/1/7/1320).
>>
>> So this requires to sprinkle those inline assembly with ".syntax
>> unified" strings, similar to how I've done it in uaccess.h.
>
> Not sure if this is purely a bug in GCC; Clang treats inline asm
> statements as unique, so asm directives do not carry over from one
> inline asm statement to another. This has caused issues in other
> arch's inline assembly, where we need to repeat asm directives
> repeatedly for each inline asm statement.
> https://bugs.llvm.org/show_bug.cgi?id=19749

I don't think that this Clang bug is related.

GCC always emits a ".syntax xxx". The -masm-syntax-unified flag allows
to select unified syntax, but it is broken in current GCC releases. I
reported the bug and sent a fix to the GCC community, the upcoming GCC
9, as well as 7 and 8 bugfix releases, will have it fixed.

See:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648

--
Stefan