Message ID | 20200527122201.124090-1-linus.walleij@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ARM: asm: Rewrite get_thread_info using BIC | expand |
On Wed, May 27, 2020 at 02:22:01PM +0200, Linus Walleij wrote: > By using two BIC instructions we can replace the ARM/thumb > split instructions with something that works on either > and also save one instruction. > > Based on code from proc-macros.S and an idea from Ard > Biesheuvel. > > We need to include <linux/const.h> to expand the > THREAD_SIZE definition properly in the preprocessor. > > Suggested-by: Russell King <linux@armlinux.org.uk> > Suggested-by: Ard Biesheuvel <ardb@kernel.org> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Looks good to me, thanks. > --- > arch/arm/include/asm/assembler.h | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h > index 99929122dad7..f218e8cf7f88 100644 > --- a/arch/arm/include/asm/assembler.h > +++ b/arch/arm/include/asm/assembler.h > @@ -17,6 +17,7 @@ > #error "Only include this from assembly code" > #endif > > +#include <linux/const.h> > #include <asm/ptrace.h> > #include <asm/domain.h> > #include <asm/opcodes-virt.h> > @@ -203,10 +204,8 @@ > * Get current thread_info. > */ > .macro get_thread_info, rd > - ARM( mov \rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT ) > - THUMB( mov \rd, sp ) > - THUMB( lsr \rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT ) > - mov \rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT > + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 > + bic \rd, \rd, #63 > .endm > > /* > -- > 2.25.4 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >
27.05.2020 15:22, Linus Walleij пишет: > By using two BIC instructions we can replace the ARM/thumb > split instructions with something that works on either > and also save one instruction. > > Based on code from proc-macros.S and an idea from Ard > Biesheuvel. > > We need to include <linux/const.h> to expand the > THREAD_SIZE definition properly in the preprocessor. > > Suggested-by: Russell King <linux@armlinux.org.uk> > Suggested-by: Ard Biesheuvel <ardb@kernel.org> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > arch/arm/include/asm/assembler.h | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h > index 99929122dad7..f218e8cf7f88 100644 > --- a/arch/arm/include/asm/assembler.h > +++ b/arch/arm/include/asm/assembler.h > @@ -17,6 +17,7 @@ > #error "Only include this from assembly code" > #endif > > +#include <linux/const.h> > #include <asm/ptrace.h> > #include <asm/domain.h> > #include <asm/opcodes-virt.h> > @@ -203,10 +204,8 @@ > * Get current thread_info. > */ > .macro get_thread_info, rd > - ARM( mov \rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT ) > - THUMB( mov \rd, sp ) > - THUMB( lsr \rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT ) > - mov \rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT > + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 > + bic \rd, \rd, #63 > .endm > > /* > Hello, Linus! This patch was merged into a recent linux-next, unfortunately it breaks CONFIG_THUMB2_KERNEL=y compilation: arch/arm/kernel/entry-common.S: Assembler messages: arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic tsk,sp,#(((1<<12)<<1)-1)&~63' arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic tsk,sp,#(((1<<12)<<1)-1)&~63' make[2]: *** [scripts/Makefile.build:361: arch/arm/kernel/entry-common.o] Error 1
On Tue, Jul 21, 2020 at 04:37:09PM +0300, Dmitry Osipenko wrote: > 27.05.2020 15:22, Linus Walleij пишет: > > By using two BIC instructions we can replace the ARM/thumb > > split instructions with something that works on either > > and also save one instruction. > > > > Based on code from proc-macros.S and an idea from Ard > > Biesheuvel. > > > > We need to include <linux/const.h> to expand the > > THREAD_SIZE definition properly in the preprocessor. > > > > Suggested-by: Russell King <linux@armlinux.org.uk> > > Suggested-by: Ard Biesheuvel <ardb@kernel.org> > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > > --- > > arch/arm/include/asm/assembler.h | 7 +++---- > > 1 file changed, 3 insertions(+), 4 deletions(-) > > > > diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h > > index 99929122dad7..f218e8cf7f88 100644 > > --- a/arch/arm/include/asm/assembler.h > > +++ b/arch/arm/include/asm/assembler.h > > @@ -17,6 +17,7 @@ > > #error "Only include this from assembly code" > > #endif > > > > +#include <linux/const.h> > > #include <asm/ptrace.h> > > #include <asm/domain.h> > > #include <asm/opcodes-virt.h> > > @@ -203,10 +204,8 @@ > > * Get current thread_info. > > */ > > .macro get_thread_info, rd > > - ARM( mov \rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT ) > > - THUMB( mov \rd, sp ) > > - THUMB( lsr \rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT ) > > - mov \rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT > > + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 > > + bic \rd, \rd, #63 > > .endm > > > > /* > > > > Hello, Linus! > > This patch was merged into a recent linux-next, unfortunately it breaks > CONFIG_THUMB2_KERNEL=y compilation: > > arch/arm/kernel/entry-common.S: Assembler messages: > arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic > tsk,sp,#(((1<<12)<<1)-1)&~63' > arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic > tsk,sp,#(((1<<12)<<1)-1)&~63' > make[2]: *** [scripts/Makefile.build:361: > arch/arm/kernel/entry-common.o] Error 1 I've dropped it before you sent this email...
21.07.2020 16:38, Russell King - ARM Linux admin пишет: > On Tue, Jul 21, 2020 at 04:37:09PM +0300, Dmitry Osipenko wrote: >> 27.05.2020 15:22, Linus Walleij пишет: >>> By using two BIC instructions we can replace the ARM/thumb >>> split instructions with something that works on either >>> and also save one instruction. >>> >>> Based on code from proc-macros.S and an idea from Ard >>> Biesheuvel. >>> >>> We need to include <linux/const.h> to expand the >>> THREAD_SIZE definition properly in the preprocessor. >>> >>> Suggested-by: Russell King <linux@armlinux.org.uk> >>> Suggested-by: Ard Biesheuvel <ardb@kernel.org> >>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> >>> --- >>> arch/arm/include/asm/assembler.h | 7 +++---- >>> 1 file changed, 3 insertions(+), 4 deletions(-) >>> >>> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h >>> index 99929122dad7..f218e8cf7f88 100644 >>> --- a/arch/arm/include/asm/assembler.h >>> +++ b/arch/arm/include/asm/assembler.h >>> @@ -17,6 +17,7 @@ >>> #error "Only include this from assembly code" >>> #endif >>> >>> +#include <linux/const.h> >>> #include <asm/ptrace.h> >>> #include <asm/domain.h> >>> #include <asm/opcodes-virt.h> >>> @@ -203,10 +204,8 @@ >>> * Get current thread_info. >>> */ >>> .macro get_thread_info, rd >>> - ARM( mov \rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT ) >>> - THUMB( mov \rd, sp ) >>> - THUMB( lsr \rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT ) >>> - mov \rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT >>> + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 >>> + bic \rd, \rd, #63 >>> .endm >>> >>> /* >>> >> >> Hello, Linus! >> >> This patch was merged into a recent linux-next, unfortunately it breaks >> CONFIG_THUMB2_KERNEL=y compilation: >> >> arch/arm/kernel/entry-common.S: Assembler messages: >> arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic >> tsk,sp,#(((1<<12)<<1)-1)&~63' >> arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic >> tsk,sp,#(((1<<12)<<1)-1)&~63' >> make[2]: *** [scripts/Makefile.build:361: >> arch/arm/kernel/entry-common.o] Error 1 > > I've dropped it before you sent this email... Hello, Russell! Good to know, thank you!
On Tue, Jul 21, 2020 at 3:37 PM Dmitry Osipenko <digetx@gmail.com> wrote: > This patch was merged into a recent linux-next, unfortunately it breaks > CONFIG_THUMB2_KERNEL=y compilation: > > arch/arm/kernel/entry-common.S: Assembler messages: > arch/arm/kernel/entry-common.S:159: Error: r13 not allowed here -- `bic > tsk,sp,#(((1<<12)<<1)-1)&~63' > arch/arm/kernel/entry-common.S:246: Error: r13 not allowed here -- `bic > tsk,sp,#(((1<<12)<<1)-1)&~63' > make[2]: *** [scripts/Makefile.build:361: > arch/arm/kernel/entry-common.o] Error 1 Ah how typical. I suppose we simply need to give up on this idea to simplify using BIC. It was worth a try. Yours, Linus Walleij
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 99929122dad7..f218e8cf7f88 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -17,6 +17,7 @@ #error "Only include this from assembly code" #endif +#include <linux/const.h> #include <asm/ptrace.h> #include <asm/domain.h> #include <asm/opcodes-virt.h> @@ -203,10 +204,8 @@ * Get current thread_info. */ .macro get_thread_info, rd - ARM( mov \rd, sp, lsr #THREAD_SIZE_ORDER + PAGE_SHIFT ) - THUMB( mov \rd, sp ) - THUMB( lsr \rd, \rd, #THREAD_SIZE_ORDER + PAGE_SHIFT ) - mov \rd, \rd, lsl #THREAD_SIZE_ORDER + PAGE_SHIFT + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 + bic \rd, \rd, #63 .endm /*
By using two BIC instructions we can replace the ARM/thumb split instructions with something that works on either and also save one instruction. Based on code from proc-macros.S and an idea from Ard Biesheuvel. We need to include <linux/const.h> to expand the THREAD_SIZE definition properly in the preprocessor. Suggested-by: Russell King <linux@armlinux.org.uk> Suggested-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- arch/arm/include/asm/assembler.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)