* [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang [not found] <1455815113-2562966-1-git-send-email-arnd@arndb.de> @ 2016-02-18 17:05 ` Arnd Bergmann 2016-02-18 17:31 ` Nicolas Pitre 2016-02-18 17:05 ` [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building " Arnd Bergmann 2016-02-18 17:05 ` [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets Arnd Bergmann 2 siblings, 1 reply; 11+ messages in thread From: Arnd Bergmann @ 2016-02-18 17:05 UTC (permalink / raw) To: Russell King Cc: linux-arm-kernel, Arnd Bergmann, Ard Biesheuvel, Nicolas Pitre, Jon Medhurst, Marc Zyngier, linux-kernel clang ignores the -mfpu=neon flag when building with -march=armv6: In file included from lib/raid6/neon1.c:27: clang/3.8.0/include/arm_neon.h:28:2: error: "NEON support not enabled" There is no real need to build the file with -march=armv6 in a multi-CPU enabled kernel, as nothing in here will ever get called on an ARMv6 CPU. Adding -march=armv7 doesn't hurt and can only improve the code quality. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/lib/Makefile | 2 +- lib/raid6/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index d8a780799506..a86c6c8e0648 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -35,7 +35,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S ifeq ($(CONFIG_KERNEL_MODE_NEON),y) - NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon + NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon -march=armv7-a CFLAGS_xor-neon.o += $(NEON_FLAGS) obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o endif diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile index 3b10a48fa040..4ef3e800fb39 100644 --- a/lib/raid6/Makefile +++ b/lib/raid6/Makefile @@ -23,7 +23,7 @@ endif ifeq ($(CONFIG_KERNEL_MODE_NEON),y) NEON_FLAGS := -ffreestanding ifeq ($(ARCH),arm) -NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon +NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7-a endif ifeq ($(ARCH),arm64) CFLAGS_REMOVE_neon1.o += -mgeneral-regs-only -- 2.7.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang 2016-02-18 17:05 ` [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang Arnd Bergmann @ 2016-02-18 17:31 ` Nicolas Pitre 2016-02-19 14:23 ` Arnd Bergmann 0 siblings, 1 reply; 11+ messages in thread From: Nicolas Pitre @ 2016-02-18 17:31 UTC (permalink / raw) To: Arnd Bergmann Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Jon Medhurst, Marc Zyngier, linux-kernel On Thu, 18 Feb 2016, Arnd Bergmann wrote: > clang ignores the -mfpu=neon flag when building with -march=armv6: > > In file included from lib/raid6/neon1.c:27: > clang/3.8.0/include/arm_neon.h:28:2: error: "NEON support not enabled" > > There is no real need to build the file with -march=armv6 in a > multi-CPU enabled kernel, as nothing in here will ever get called > on an ARMv6 CPU. Adding -march=armv7 doesn't hurt and can only > improve the code quality. Is this enough to override a previous -mfpu for gcc? > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > arch/arm/lib/Makefile | 2 +- > lib/raid6/Makefile | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile > index d8a780799506..a86c6c8e0648 100644 > --- a/arch/arm/lib/Makefile > +++ b/arch/arm/lib/Makefile > @@ -35,7 +35,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S > $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S > > ifeq ($(CONFIG_KERNEL_MODE_NEON),y) > - NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon > + NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon -march=armv7-a > CFLAGS_xor-neon.o += $(NEON_FLAGS) > obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o > endif > diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile > index 3b10a48fa040..4ef3e800fb39 100644 > --- a/lib/raid6/Makefile > +++ b/lib/raid6/Makefile > @@ -23,7 +23,7 @@ endif > ifeq ($(CONFIG_KERNEL_MODE_NEON),y) > NEON_FLAGS := -ffreestanding > ifeq ($(ARCH),arm) > -NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon > +NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7-a > endif > ifeq ($(ARCH),arm64) > CFLAGS_REMOVE_neon1.o += -mgeneral-regs-only > -- > 2.7.0 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang 2016-02-18 17:31 ` Nicolas Pitre @ 2016-02-19 14:23 ` Arnd Bergmann 2016-02-19 17:08 ` Nicolas Pitre 0 siblings, 1 reply; 11+ messages in thread From: Arnd Bergmann @ 2016-02-19 14:23 UTC (permalink / raw) To: Nicolas Pitre Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Jon Medhurst, Marc Zyngier, linux-kernel On Thursday 18 February 2016 12:31:35 Nicolas Pitre wrote: > On Thu, 18 Feb 2016, Arnd Bergmann wrote: > > > clang ignores the -mfpu=neon flag when building with -march=armv6: > > > > In file included from lib/raid6/neon1.c:27: > > clang/3.8.0/include/arm_neon.h:28:2: error: "NEON support not enabled" > > > > There is no real need to build the file with -march=armv6 in a > > multi-CPU enabled kernel, as nothing in here will ever get called > > on an ARMv6 CPU. Adding -march=armv7 doesn't hurt and can only > > improve the code quality. > > Is this enough to override a previous -mfpu for gcc? I did not see any build failures on gcc with this, so I assume it has no effect. I could move the -march=armv7-a in front of -mfpu=neon if you think that would be safer though. Arnd ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang 2016-02-19 14:23 ` Arnd Bergmann @ 2016-02-19 17:08 ` Nicolas Pitre 0 siblings, 0 replies; 11+ messages in thread From: Nicolas Pitre @ 2016-02-19 17:08 UTC (permalink / raw) To: Arnd Bergmann Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Jon Medhurst, Marc Zyngier, linux-kernel On Fri, 19 Feb 2016, Arnd Bergmann wrote: > On Thursday 18 February 2016 12:31:35 Nicolas Pitre wrote: > > On Thu, 18 Feb 2016, Arnd Bergmann wrote: > > > > > clang ignores the -mfpu=neon flag when building with -march=armv6: > > > > > > In file included from lib/raid6/neon1.c:27: > > > clang/3.8.0/include/arm_neon.h:28:2: error: "NEON support not enabled" > > > > > > There is no real need to build the file with -march=armv6 in a > > > multi-CPU enabled kernel, as nothing in here will ever get called > > > on an ARMv6 CPU. Adding -march=armv7 doesn't hurt and can only > > > improve the code quality. > > > > Is this enough to override a previous -mfpu for gcc? > > I did not see any build failures on gcc with this, so I assume it > has no effect. I could move the -march=armv7-a in front of > -mfpu=neon if you think that would be safer though. I don't know what's safer. That's why I'm asking. :-) Nicolas ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building with clang [not found] <1455815113-2562966-1-git-send-email-arnd@arndb.de> 2016-02-18 17:05 ` [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang Arnd Bergmann @ 2016-02-18 17:05 ` Arnd Bergmann 2016-02-18 17:34 ` Nicolas Pitre 2016-02-18 17:05 ` [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets Arnd Bergmann 2 siblings, 1 reply; 11+ messages in thread From: Arnd Bergmann @ 2016-02-18 17:05 UTC (permalink / raw) To: Russell King Cc: linux-arm-kernel, Arnd Bergmann, Ard Biesheuvel, Nicolas Pitre, Jon Medhurst, Marc Zyngier, linux-kernel clang does not allow inline assembly in __naked functions to have any register parameters and throws an error: arch/arm/mm/copypage-v4wb.c:47:9: error: parameter references not allowed in naked functions : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); Fortunately, all of these functions are trivial to convert to using the registers directly. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/mm/copypage-feroceon.c | 4 ++-- arch/arm/mm/copypage-v4mc.c | 26 +++++++++++++------------- arch/arm/mm/copypage-v4wb.c | 4 ++-- arch/arm/mm/copypage-v4wt.c | 4 ++-- arch/arm/mm/copypage-xsc3.c | 4 ++-- arch/arm/mm/copypage-xscale.c | 4 ++-- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c index 49ee0c1a7209..e69bf2f15f32 100644 --- a/arch/arm/mm/copypage-feroceon.c +++ b/arch/arm/mm/copypage-feroceon.c @@ -18,7 +18,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom) { asm("\ stmfd sp!, {r4-r9, lr} \n\ - mov ip, %2 \n\ + mov ip, %0 \n\ 1: mov lr, r1 \n\ ldmia r1!, {r2 - r9} \n\ pld [lr, #32] \n\ @@ -64,7 +64,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom) mcr p15, 0, ip, c7, c10, 4 @ drain WB\n\ ldmfd sp!, {r4-r9, pc}" : - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE)); + : "I" (PAGE_SIZE)); } void feroceon_copy_user_highpage(struct page *to, struct page *from, diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c index 1267e64133b9..ea89722c00db 100644 --- a/arch/arm/mm/copypage-v4mc.c +++ b/arch/arm/mm/copypage-v4mc.c @@ -45,23 +45,23 @@ mc_copy_user_page(void *from, void *to) { asm volatile( "stmfd sp!, {r4, lr} @ 2\n\ - mov r4, %2 @ 1\n\ - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ -1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ - stmia %1!, {r2, r3, ip, lr} @ 4\n\ - ldmia %0!, {r2, r3, ip, lr} @ 4+1\n\ - stmia %1!, {r2, r3, ip, lr} @ 4\n\ - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ - mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ - stmia %1!, {r2, r3, ip, lr} @ 4\n\ - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ + mov r4, %0 @ 1\n\ + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ +1: mcr p15, 0, r1, c7, c6, 1 @ 1 invalidate D line\n\ + stmia r1!, {r2, r3, ip, lr} @ 4\n\ + ldmia r0!, {r2, r3, ip, lr} @ 4+1\n\ + stmia r1!, {r2, r3, ip, lr} @ 4\n\ + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ + mcr p15, 0, r1, c7, c6, 1 @ 1 invalidate D line\n\ + stmia r1!, {r2, r3, ip, lr} @ 4\n\ + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ subs r4, r4, #1 @ 1\n\ - stmia %1!, {r2, r3, ip, lr} @ 4\n\ - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\ + stmia r1!, {r2, r3, ip, lr} @ 4\n\ + ldmneia r0!, {r2, r3, ip, lr} @ 4\n\ bne 1b @ 1\n\ ldmfd sp!, {r4, pc} @ 3" : - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64)); + : "I" (PAGE_SIZE / 64)); } void v4_mc_copy_user_highpage(struct page *to, struct page *from, diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c index 067d0fdd630c..7ea9cf07bd5c 100644 --- a/arch/arm/mm/copypage-v4wb.c +++ b/arch/arm/mm/copypage-v4wb.c @@ -27,7 +27,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom) { asm("\ stmfd sp!, {r4, lr} @ 2\n\ - mov r2, %2 @ 1\n\ + mov r2, %0 @ 1\n\ ldmia r1!, {r3, r4, ip, lr} @ 4\n\ 1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\ stmia r0!, {r3, r4, ip, lr} @ 4\n\ @@ -44,7 +44,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom) mcr p15, 0, r1, c7, c10, 4 @ 1 drain WB\n\ ldmfd sp!, {r4, pc} @ 3" : - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); + : "I" (PAGE_SIZE / 64)); } void v4wb_copy_user_highpage(struct page *to, struct page *from, diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c index b85c5da2e510..c742ab24efd6 100644 --- a/arch/arm/mm/copypage-v4wt.c +++ b/arch/arm/mm/copypage-v4wt.c @@ -25,7 +25,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom) { asm("\ stmfd sp!, {r4, lr} @ 2\n\ - mov r2, %2 @ 1\n\ + mov r2, %0 @ 1\n\ ldmia r1!, {r3, r4, ip, lr} @ 4\n\ 1: stmia r0!, {r3, r4, ip, lr} @ 4\n\ ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\ @@ -40,7 +40,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom) mcr p15, 0, r2, c7, c7, 0 @ flush ID cache\n\ ldmfd sp!, {r4, pc} @ 3" : - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); + : "I" (PAGE_SIZE / 64)); } void v4wt_copy_user_highpage(struct page *to, struct page *from, diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c index 03a2042aced5..17e4e11c4612 100644 --- a/arch/arm/mm/copypage-xsc3.c +++ b/arch/arm/mm/copypage-xsc3.c @@ -34,7 +34,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom) { asm("\ stmfd sp!, {r4, r5, lr} \n\ - mov lr, %2 \n\ + mov lr, %0 \n\ \n\ pld [r1, #0] \n\ pld [r1, #32] \n\ @@ -67,7 +67,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom) \n\ ldmfd sp!, {r4, r5, pc}" : - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64 - 1)); + : "I" (PAGE_SIZE / 64 - 1)); } void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c index 0fb85025344d..1034b4ce80cc 100644 --- a/arch/arm/mm/copypage-xscale.c +++ b/arch/arm/mm/copypage-xscale.c @@ -45,7 +45,7 @@ mc_copy_user_page(void *from, void *to) */ asm volatile( "stmfd sp!, {r4, r5, lr} \n\ - mov lr, %2 \n\ + mov lr, %0 \n\ pld [r0, #0] \n\ pld [r0, #32] \n\ pld [r1, #0] \n\ @@ -81,7 +81,7 @@ mc_copy_user_page(void *from, void *to) beq 2b \n\ ldmfd sp!, {r4, r5, pc} " : - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64 - 1)); + : "I" (PAGE_SIZE / 64 - 1)); } void xscale_mc_copy_user_highpage(struct page *to, struct page *from, -- 2.7.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building with clang 2016-02-18 17:05 ` [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building " Arnd Bergmann @ 2016-02-18 17:34 ` Nicolas Pitre 0 siblings, 0 replies; 11+ messages in thread From: Nicolas Pitre @ 2016-02-18 17:34 UTC (permalink / raw) To: Arnd Bergmann Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Jon Medhurst, Marc Zyngier, linux-kernel On Thu, 18 Feb 2016, Arnd Bergmann wrote: > clang does not allow inline assembly in __naked functions to > have any register parameters and throws an error: > > arch/arm/mm/copypage-v4wb.c:47:9: error: parameter references not allowed in naked functions > : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); > > Fortunately, all of these functions are trivial to convert to > using the registers directly. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Nicolas Pitre <nico@linaro.org> > --- > arch/arm/mm/copypage-feroceon.c | 4 ++-- > arch/arm/mm/copypage-v4mc.c | 26 +++++++++++++------------- > arch/arm/mm/copypage-v4wb.c | 4 ++-- > arch/arm/mm/copypage-v4wt.c | 4 ++-- > arch/arm/mm/copypage-xsc3.c | 4 ++-- > arch/arm/mm/copypage-xscale.c | 4 ++-- > 6 files changed, 23 insertions(+), 23 deletions(-) > > diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c > index 49ee0c1a7209..e69bf2f15f32 100644 > --- a/arch/arm/mm/copypage-feroceon.c > +++ b/arch/arm/mm/copypage-feroceon.c > @@ -18,7 +18,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom) > { > asm("\ > stmfd sp!, {r4-r9, lr} \n\ > - mov ip, %2 \n\ > + mov ip, %0 \n\ > 1: mov lr, r1 \n\ > ldmia r1!, {r2 - r9} \n\ > pld [lr, #32] \n\ > @@ -64,7 +64,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom) > mcr p15, 0, ip, c7, c10, 4 @ drain WB\n\ > ldmfd sp!, {r4-r9, pc}" > : > - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE)); > + : "I" (PAGE_SIZE)); > } > > void feroceon_copy_user_highpage(struct page *to, struct page *from, > diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c > index 1267e64133b9..ea89722c00db 100644 > --- a/arch/arm/mm/copypage-v4mc.c > +++ b/arch/arm/mm/copypage-v4mc.c > @@ -45,23 +45,23 @@ mc_copy_user_page(void *from, void *to) > { > asm volatile( > "stmfd sp!, {r4, lr} @ 2\n\ > - mov r4, %2 @ 1\n\ > - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ > -1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ > - stmia %1!, {r2, r3, ip, lr} @ 4\n\ > - ldmia %0!, {r2, r3, ip, lr} @ 4+1\n\ > - stmia %1!, {r2, r3, ip, lr} @ 4\n\ > - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ > - mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ > - stmia %1!, {r2, r3, ip, lr} @ 4\n\ > - ldmia %0!, {r2, r3, ip, lr} @ 4\n\ > + mov r4, %0 @ 1\n\ > + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ > +1: mcr p15, 0, r1, c7, c6, 1 @ 1 invalidate D line\n\ > + stmia r1!, {r2, r3, ip, lr} @ 4\n\ > + ldmia r0!, {r2, r3, ip, lr} @ 4+1\n\ > + stmia r1!, {r2, r3, ip, lr} @ 4\n\ > + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ > + mcr p15, 0, r1, c7, c6, 1 @ 1 invalidate D line\n\ > + stmia r1!, {r2, r3, ip, lr} @ 4\n\ > + ldmia r0!, {r2, r3, ip, lr} @ 4\n\ > subs r4, r4, #1 @ 1\n\ > - stmia %1!, {r2, r3, ip, lr} @ 4\n\ > - ldmneia %0!, {r2, r3, ip, lr} @ 4\n\ > + stmia r1!, {r2, r3, ip, lr} @ 4\n\ > + ldmneia r0!, {r2, r3, ip, lr} @ 4\n\ > bne 1b @ 1\n\ > ldmfd sp!, {r4, pc} @ 3" > : > - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64)); > + : "I" (PAGE_SIZE / 64)); > } > > void v4_mc_copy_user_highpage(struct page *to, struct page *from, > diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c > index 067d0fdd630c..7ea9cf07bd5c 100644 > --- a/arch/arm/mm/copypage-v4wb.c > +++ b/arch/arm/mm/copypage-v4wb.c > @@ -27,7 +27,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom) > { > asm("\ > stmfd sp!, {r4, lr} @ 2\n\ > - mov r2, %2 @ 1\n\ > + mov r2, %0 @ 1\n\ > ldmia r1!, {r3, r4, ip, lr} @ 4\n\ > 1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\ > stmia r0!, {r3, r4, ip, lr} @ 4\n\ > @@ -44,7 +44,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom) > mcr p15, 0, r1, c7, c10, 4 @ 1 drain WB\n\ > ldmfd sp!, {r4, pc} @ 3" > : > - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); > + : "I" (PAGE_SIZE / 64)); > } > > void v4wb_copy_user_highpage(struct page *to, struct page *from, > diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c > index b85c5da2e510..c742ab24efd6 100644 > --- a/arch/arm/mm/copypage-v4wt.c > +++ b/arch/arm/mm/copypage-v4wt.c > @@ -25,7 +25,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom) > { > asm("\ > stmfd sp!, {r4, lr} @ 2\n\ > - mov r2, %2 @ 1\n\ > + mov r2, %0 @ 1\n\ > ldmia r1!, {r3, r4, ip, lr} @ 4\n\ > 1: stmia r0!, {r3, r4, ip, lr} @ 4\n\ > ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\ > @@ -40,7 +40,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom) > mcr p15, 0, r2, c7, c7, 0 @ flush ID cache\n\ > ldmfd sp!, {r4, pc} @ 3" > : > - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); > + : "I" (PAGE_SIZE / 64)); > } > > void v4wt_copy_user_highpage(struct page *to, struct page *from, > diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c > index 03a2042aced5..17e4e11c4612 100644 > --- a/arch/arm/mm/copypage-xsc3.c > +++ b/arch/arm/mm/copypage-xsc3.c > @@ -34,7 +34,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom) > { > asm("\ > stmfd sp!, {r4, r5, lr} \n\ > - mov lr, %2 \n\ > + mov lr, %0 \n\ > \n\ > pld [r1, #0] \n\ > pld [r1, #32] \n\ > @@ -67,7 +67,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom) > \n\ > ldmfd sp!, {r4, r5, pc}" > : > - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64 - 1)); > + : "I" (PAGE_SIZE / 64 - 1)); > } > > void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, > diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c > index 0fb85025344d..1034b4ce80cc 100644 > --- a/arch/arm/mm/copypage-xscale.c > +++ b/arch/arm/mm/copypage-xscale.c > @@ -45,7 +45,7 @@ mc_copy_user_page(void *from, void *to) > */ > asm volatile( > "stmfd sp!, {r4, r5, lr} \n\ > - mov lr, %2 \n\ > + mov lr, %0 \n\ > pld [r0, #0] \n\ > pld [r0, #32] \n\ > pld [r1, #0] \n\ > @@ -81,7 +81,7 @@ mc_copy_user_page(void *from, void *to) > beq 2b \n\ > ldmfd sp!, {r4, r5, pc} " > : > - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64 - 1)); > + : "I" (PAGE_SIZE / 64 - 1)); > } > > void xscale_mc_copy_user_highpage(struct page *to, struct page *from, > -- > 2.7.0 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets [not found] <1455815113-2562966-1-git-send-email-arnd@arndb.de> 2016-02-18 17:05 ` [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang Arnd Bergmann 2016-02-18 17:05 ` [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building " Arnd Bergmann @ 2016-02-18 17:05 ` Arnd Bergmann 2016-02-18 18:12 ` Jon Medhurst (Tixy) 2016-02-18 18:24 ` Nicolas Pitre 2 siblings, 2 replies; 11+ messages in thread From: Arnd Bergmann @ 2016-02-18 17:05 UTC (permalink / raw) To: Russell King Cc: linux-arm-kernel, Arnd Bergmann, Ard Biesheuvel, Nicolas Pitre, Jon Medhurst, Marc Zyngier, linux-kernel build-testing with clang showed that the "J" constraint does not take positive arguments on clang when building in for Thumb-2: core.c:540:3: error: invalid operand for inline asm constraint 'J' This has been reported as llvm bug https://llvm.org/bugs/show_bug.cgi?id=26061 However, looking at the source code in depth, I found that the kernel is also wrong, and it should not use "J" at all, but should use "I" to pass an immediate argument to the inline assembly when that is used as an offset to an 'ldr' instruction rather than the 'sub' argument. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/probes/kprobes/core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c index a4ec240ee7ba..4b34b40ca917 100644 --- a/arch/arm/probes/kprobes/core.c +++ b/arch/arm/probes/kprobes/core.c @@ -570,10 +570,10 @@ void __kprobes jprobe_return(void) : : "r" (kcb->jprobe_saved_regs.ARM_sp), "I" (sizeof(struct pt_regs) * 2), - "J" (offsetof(struct pt_regs, ARM_sp)), - "J" (offsetof(struct pt_regs, ARM_pc)), - "J" (offsetof(struct pt_regs, ARM_cpsr)), - "J" (offsetof(struct pt_regs, ARM_lr)) + "I" (offsetof(struct pt_regs, ARM_sp)), + "I" (offsetof(struct pt_regs, ARM_pc)), + "I" (offsetof(struct pt_regs, ARM_cpsr)), + "I" (offsetof(struct pt_regs, ARM_lr)) : "memory", "cc"); } -- 2.7.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets 2016-02-18 17:05 ` [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets Arnd Bergmann @ 2016-02-18 18:12 ` Jon Medhurst (Tixy) 2016-02-18 18:59 ` Robin Murphy 2016-02-18 18:24 ` Nicolas Pitre 1 sibling, 1 reply; 11+ messages in thread From: Jon Medhurst (Tixy) @ 2016-02-18 18:12 UTC (permalink / raw) To: Arnd Bergmann Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Nicolas Pitre, Marc Zyngier, linux-kernel On Thu, 2016-02-18 at 18:05 +0100, Arnd Bergmann wrote: > build-testing with clang showed that the "J" constraint does not take > positive arguments on clang when building in for Thumb-2: > > core.c:540:3: error: invalid operand for inline asm constraint 'J' > > This has been reported as llvm bug https://llvm.org/bugs/show_bug.cgi?id=26061 > > However, looking at the source code in depth, I found that the > kernel is also wrong, and it should not use "J" at all, but should > use "I" to pass an immediate argument to the inline assembly when that > is used as an offset to an 'ldr' instruction rather than the 'sub' > argument. This patch doesn't seem correct to me. The ARM ARM says the immediate offset to an ARM ldr instructions is "any value in the range 0-4095" and offsets may be added or subtracted, leading to values from −4095 to 4095". And GCC machine constraints [1] says I Integer that is valid as an immediate operand in a data processing instruction. That is, an integer in the range 0 to 255 rotated by a multiple of 2 J Integer in the range −4095 to 4095 So the current use of 'J' seems correct to me. [1] https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > arch/arm/probes/kprobes/core.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c > index a4ec240ee7ba..4b34b40ca917 100644 > --- a/arch/arm/probes/kprobes/core.c > +++ b/arch/arm/probes/kprobes/core.c > @@ -570,10 +570,10 @@ void __kprobes jprobe_return(void) > : > : "r" (kcb->jprobe_saved_regs.ARM_sp), > "I" (sizeof(struct pt_regs) * 2), > - "J" (offsetof(struct pt_regs, ARM_sp)), > - "J" (offsetof(struct pt_regs, ARM_pc)), > - "J" (offsetof(struct pt_regs, ARM_cpsr)), > - "J" (offsetof(struct pt_regs, ARM_lr)) > + "I" (offsetof(struct pt_regs, ARM_sp)), > + "I" (offsetof(struct pt_regs, ARM_pc)), > + "I" (offsetof(struct pt_regs, ARM_cpsr)), > + "I" (offsetof(struct pt_regs, ARM_lr)) > : "memory", "cc"); > } > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets 2016-02-18 18:12 ` Jon Medhurst (Tixy) @ 2016-02-18 18:59 ` Robin Murphy 2016-02-19 9:34 ` Jon Medhurst (Tixy) 0 siblings, 1 reply; 11+ messages in thread From: Robin Murphy @ 2016-02-18 18:59 UTC (permalink / raw) To: Jon Medhurst (Tixy), Arnd Bergmann Cc: Russell King, Nicolas Pitre, Marc Zyngier, Ard Biesheuvel, linux-kernel, linux-arm-kernel On 18/02/16 18:12, Jon Medhurst (Tixy) wrote: > On Thu, 2016-02-18 at 18:05 +0100, Arnd Bergmann wrote: >> build-testing with clang showed that the "J" constraint does not take >> positive arguments on clang when building in for Thumb-2: >> >> core.c:540:3: error: invalid operand for inline asm constraint 'J' >> >> This has been reported as llvm bug https://llvm.org/bugs/show_bug.cgi?id=26061 >> >> However, looking at the source code in depth, I found that the >> kernel is also wrong, and it should not use "J" at all, but should >> use "I" to pass an immediate argument to the inline assembly when that >> is used as an offset to an 'ldr' instruction rather than the 'sub' >> argument. > > This patch doesn't seem correct to me. > > The ARM ARM says the immediate offset to an ARM ldr instructions is "any > value in the range 0-4095" and offsets may be added or subtracted, > leading to values from −4095 to 4095". > > And GCC machine constraints [1] says > > I > Integer that is valid as an immediate operand in a data processing > instruction. That is, an integer in the range 0 to 255 rotated by a > multiple of 2 > J > Integer in the range −4095 to 4095 > > So the current use of 'J' seems correct to me. Hmm, Arnd reports the failure when building for Thumb-2, and the code under #ifdef CONFIG_THUMB2_KERNEL contains an ldrd, which takes a different immediate of the form imm8 * 4. Maybe it's just operand %5 which needs fixing, although I don't see that a suitable constraint for that actually exists... Robin. > [1] https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints > > >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >> --- >> arch/arm/probes/kprobes/core.c | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c >> index a4ec240ee7ba..4b34b40ca917 100644 >> --- a/arch/arm/probes/kprobes/core.c >> +++ b/arch/arm/probes/kprobes/core.c >> @@ -570,10 +570,10 @@ void __kprobes jprobe_return(void) >> : >> : "r" (kcb->jprobe_saved_regs.ARM_sp), >> "I" (sizeof(struct pt_regs) * 2), >> - "J" (offsetof(struct pt_regs, ARM_sp)), >> - "J" (offsetof(struct pt_regs, ARM_pc)), >> - "J" (offsetof(struct pt_regs, ARM_cpsr)), >> - "J" (offsetof(struct pt_regs, ARM_lr)) >> + "I" (offsetof(struct pt_regs, ARM_sp)), >> + "I" (offsetof(struct pt_regs, ARM_pc)), >> + "I" (offsetof(struct pt_regs, ARM_cpsr)), >> + "I" (offsetof(struct pt_regs, ARM_lr)) >> : "memory", "cc"); >> } >> > > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets 2016-02-18 18:59 ` Robin Murphy @ 2016-02-19 9:34 ` Jon Medhurst (Tixy) 0 siblings, 0 replies; 11+ messages in thread From: Jon Medhurst (Tixy) @ 2016-02-19 9:34 UTC (permalink / raw) To: Robin Murphy Cc: Arnd Bergmann, Russell King, Nicolas Pitre, Marc Zyngier, Ard Biesheuvel, linux-kernel, linux-arm-kernel On Thu, 2016-02-18 at 18:59 +0000, Robin Murphy wrote: > On 18/02/16 18:12, Jon Medhurst (Tixy) wrote: > > On Thu, 2016-02-18 at 18:05 +0100, Arnd Bergmann wrote: > >> build-testing with clang showed that the "J" constraint does not take > >> positive arguments on clang when building in for Thumb-2: > >> > >> core.c:540:3: error: invalid operand for inline asm constraint 'J' > >> > >> This has been reported as llvm bug https://llvm.org/bugs/show_bug.cgi?id=26061 > >> > >> However, looking at the source code in depth, I found that the > >> kernel is also wrong, and it should not use "J" at all, but should > >> use "I" to pass an immediate argument to the inline assembly when that > >> is used as an offset to an 'ldr' instruction rather than the 'sub' > >> argument. > > > > This patch doesn't seem correct to me. > > > > The ARM ARM says the immediate offset to an ARM ldr instructions is "any > > value in the range 0-4095" and offsets may be added or subtracted, > > leading to values from −4095 to 4095". > > > > And GCC machine constraints [1] says > > > > I > > Integer that is valid as an immediate operand in a data processing > > instruction. That is, an integer in the range 0 to 255 rotated by a > > multiple of 2 > > J > > Integer in the range −4095 to 4095 > > > > So the current use of 'J' seems correct to me. > > Hmm, Arnd reports the failure when building for Thumb-2, and the code > under #ifdef CONFIG_THUMB2_KERNEL contains an ldrd, which takes a > different immediate of the form imm8 * 4. Maybe it's just operand %5 > which needs fixing, although I don't see that a suitable constraint for > that actually exists... Well, under Thumb-2 plain LDR is also different, the offset is up to +/-255, except for pre-indexed without writeback mode (what the code uses) which goes up to +4095. I saw this yesterday but also that there aren't asm constraints for that. Actually, there is constraint 'Uq' which is "A memory reference suitable for the ARMv4 ldrsb instruction" and that is a value +/- 255. In practice, for the code in question, which is getting offsets into struct pt_regs, either 'I', 'J' or 'Uq' would work. 'Uq' is the one that expresses the strictest restrictions, that if met, will work with all assembler instructions used, but as it's documented as being for the "ARMv4 ldrsb instruction", it would seem a bit confusing to use that to me. -- Tixy > > Robin. > > > [1] https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints > > > > > >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> > >> --- > >> arch/arm/probes/kprobes/core.c | 8 ++++---- > >> 1 file changed, 4 insertions(+), 4 deletions(-) > >> > >> diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c > >> index a4ec240ee7ba..4b34b40ca917 100644 > >> --- a/arch/arm/probes/kprobes/core.c > >> +++ b/arch/arm/probes/kprobes/core.c > >> @@ -570,10 +570,10 @@ void __kprobes jprobe_return(void) > >> : > >> : "r" (kcb->jprobe_saved_regs.ARM_sp), > >> "I" (sizeof(struct pt_regs) * 2), > >> - "J" (offsetof(struct pt_regs, ARM_sp)), > >> - "J" (offsetof(struct pt_regs, ARM_pc)), > >> - "J" (offsetof(struct pt_regs, ARM_cpsr)), > >> - "J" (offsetof(struct pt_regs, ARM_lr)) > >> + "I" (offsetof(struct pt_regs, ARM_sp)), > >> + "I" (offsetof(struct pt_regs, ARM_pc)), > >> + "I" (offsetof(struct pt_regs, ARM_cpsr)), > >> + "I" (offsetof(struct pt_regs, ARM_lr)) > >> : "memory", "cc"); > >> } > >> > > > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets 2016-02-18 17:05 ` [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets Arnd Bergmann 2016-02-18 18:12 ` Jon Medhurst (Tixy) @ 2016-02-18 18:24 ` Nicolas Pitre 1 sibling, 0 replies; 11+ messages in thread From: Nicolas Pitre @ 2016-02-18 18:24 UTC (permalink / raw) To: Arnd Bergmann Cc: Russell King, linux-arm-kernel, Ard Biesheuvel, Jon Medhurst, Marc Zyngier, linux-kernel On Thu, 18 Feb 2016, Arnd Bergmann wrote: > build-testing with clang showed that the "J" constraint does not take > positive arguments on clang when building in for Thumb-2: > > core.c:540:3: error: invalid operand for inline asm constraint 'J' > > This has been reported as llvm bug https://llvm.org/bugs/show_bug.cgi?id=26061 > > However, looking at the source code in depth, I found that the > kernel is also wrong, and it should not use "J" at all, but should > use "I" to pass an immediate argument to the inline assembly when that > is used as an offset to an 'ldr' instruction rather than the 'sub' > argument. I don't follow you. >From the gcc manual: 'I' Integer that is valid as an immediate operand in a data processing instruction. That is, an integer in the range 0 to 255 rotated by a multiple of 2 'J' Integer in the range -4095 to 4095 >From the ARM ARM: LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}] where imm12 is a constant between 0 and 4095. So J is really the appropriate constraint here. Sure, in this case it is very likely that I would just works given that offset_of() is unlikely to exceed shifted 8 bits and that's what people use in most cases. But strictly speaking it's J that perfectly matches the LDR/STR instructions. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > arch/arm/probes/kprobes/core.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c > index a4ec240ee7ba..4b34b40ca917 100644 > --- a/arch/arm/probes/kprobes/core.c > +++ b/arch/arm/probes/kprobes/core.c > @@ -570,10 +570,10 @@ void __kprobes jprobe_return(void) > : > : "r" (kcb->jprobe_saved_regs.ARM_sp), > "I" (sizeof(struct pt_regs) * 2), > - "J" (offsetof(struct pt_regs, ARM_sp)), > - "J" (offsetof(struct pt_regs, ARM_pc)), > - "J" (offsetof(struct pt_regs, ARM_cpsr)), > - "J" (offsetof(struct pt_regs, ARM_lr)) > + "I" (offsetof(struct pt_regs, ARM_sp)), > + "I" (offsetof(struct pt_regs, ARM_pc)), > + "I" (offsetof(struct pt_regs, ARM_cpsr)), > + "I" (offsetof(struct pt_regs, ARM_lr)) > : "memory", "cc"); > } > > -- > 2.7.0 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-02-19 17:08 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1455815113-2562966-1-git-send-email-arnd@arndb.de>
2016-02-18 17:05 ` [PATCH 1/3] [RESEND] ARM: pass -march=armv7-a when building NEON files with clang Arnd Bergmann
2016-02-18 17:31 ` Nicolas Pitre
2016-02-19 14:23 ` Arnd Bergmann
2016-02-19 17:08 ` Nicolas Pitre
2016-02-18 17:05 ` [PATCH 2/3] [RESEND] ARM: fix copypage-*.c building " Arnd Bergmann
2016-02-18 17:34 ` Nicolas Pitre
2016-02-18 17:05 ` [PATCH 3/3] [RESEND] ARM: kprobes: use "I" constraint for inline assembly offsets Arnd Bergmann
2016-02-18 18:12 ` Jon Medhurst (Tixy)
2016-02-18 18:59 ` Robin Murphy
2016-02-19 9:34 ` Jon Medhurst (Tixy)
2016-02-18 18:24 ` Nicolas Pitre
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).