From: ard.biesheuvel@linaro.org (Ard Biesheuvel)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/8] ARM: assembler: introduce adr_l, ldr_l and str_l macros
Date: Wed, 3 Aug 2016 17:38:43 +0200 [thread overview]
Message-ID: <1470238730-30038-2-git-send-email-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <1470238730-30038-1-git-send-email-ard.biesheuvel@linaro.org>
Like arm64, ARM supports position independent code sequences that
produce symbol references with a greater reach than the ordinary
adr/ldr instructions.
Introduce adr_l, that takes the address of a symbol in a PC relative
manner, and ldr_l/str_l that perform a 32-bit loads/stores from a
PC-relative offset.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
arch/arm/include/asm/assembler.h | 59 ++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 4eaea2173bf8..e1450889f96b 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -512,4 +512,63 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
#endif
.endm
+/*
+ * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> operations
+ */
+
+ /*
+ * @dst: destination register
+ * @sym: name of the symbol
+ */
+ .macro adr_l, dst, sym
+#ifdef CONFIG_THUMB2_KERNEL
+ movw \dst, #:lower16:(\sym) - (. + 12)
+ movt \dst, #:upper16:(\sym) - (. + 8)
+ add \dst, \dst, pc
+#else
+ add \dst, pc, #:pc_g0_nc:(\sym) - 8
+ add \dst, \dst, #:pc_g1_nc:(\sym) - 4
+ add \dst, \dst, #:pc_g2:(\sym)
+#endif
+ .endm
+
+ /*
+ * @dst: destination register
+ * @sym: name of the symbol
+ * @tmp: optional scratch register to be used if <dst> == sp, which
+ * is not allowed in a Thumb2 ldr instruction
+ */
+ .macro ldr_l, dst, sym, tmp
+#ifdef CONFIG_THUMB2_KERNEL
+ .ifnb \tmp
+ adr_l \tmp, \sym
+ ldr \dst, [\tmp]
+ .else
+ adr_l \dst, \sym
+ ldr \dst, [\dst]
+ .endif
+#else
+ add \dst, pc, #:pc_g0_nc:(\sym) - 8
+ add \dst, \dst, #:pc_g1_nc:(\sym) - 4
+ ldr \dst, [\dst, #:pc_g2:(\sym)]
+#endif
+ .endm
+
+ /*
+ * @src: source register
+ * @sym: name of the symbol
+ * @tmp: mandatory scratch register to calculate the address
+ * while <src> needs to be preserved.
+ */
+ .macro str_l, src, sym, tmp:req
+#ifdef CONFIG_THUMB2_KERNEL
+ adr_l \tmp, \sym
+ str \src, [\tmp]
+#else
+ add \tmp, pc, #:pc_g0_nc:(\sym) - 8
+ add \tmp, \tmp, #:pc_g1_nc:(\sym) - 4
+ str \src, [\tmp, #:pc_g2:(\sym)]
+#endif
+ .endm
+
#endif /* __ASM_ASSEMBLER_H__ */
--
2.7.4
next prev parent reply other threads:[~2016-08-03 15:38 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-03 15:38 [PATCH 0/8] ARM: clean up PC-relative arithmetic Ard Biesheuvel
2016-08-03 15:38 ` Ard Biesheuvel [this message]
2016-08-03 16:49 ` [PATCH 1/8] ARM: assembler: introduce adr_l, ldr_l and str_l macros Dave Martin
2016-08-04 7:40 ` Ard Biesheuvel
2016-08-04 9:44 ` Dave Martin
2016-08-04 10:34 ` Ard Biesheuvel
2016-08-04 11:22 ` Dave Martin
2016-08-04 12:16 ` Russell King - ARM Linux
2016-08-04 12:55 ` Dave Martin
2016-08-04 13:58 ` Ard Biesheuvel
2016-08-04 7:43 ` Ard Biesheuvel
2016-08-03 18:09 ` Russell King - ARM Linux
2016-08-04 7:40 ` Ard Biesheuvel
2016-08-04 9:38 ` Dave Martin
2016-08-04 10:12 ` Ard Biesheuvel
2016-08-04 11:08 ` Dave Martin
2016-08-04 11:10 ` Ard Biesheuvel
2016-08-04 11:30 ` Dave Martin
2016-08-04 11:34 ` Ard Biesheuvel
2016-08-04 13:31 ` Dave Martin
2016-08-04 13:46 ` Ard Biesheuvel
2016-08-04 15:38 ` Dave Martin
2016-08-03 15:38 ` [PATCH 2/8] ARM: head-common.S: use PC-relative insn sequence for __proc_info Ard Biesheuvel
2016-08-03 15:38 ` [PATCH 3/8] ARM: head-common.S: use PC-relative insn sequence for __turn_mmu_on Ard Biesheuvel
2016-08-03 15:38 ` [PATCH 4/8] ARM: head.S: use PC-relative insn sequence for secondary_data Ard Biesheuvel
2016-08-03 18:06 ` Russell King - ARM Linux
2016-08-03 15:38 ` [PATCH 5/8] ARM: head: use PC-relative insn sequence for __smp_alt Ard Biesheuvel
2016-08-03 15:38 ` [PATCH 6/8] ARM: sleep.S: use PC-relative insn sequence for sleep_save_sp/mpidr_hash Ard Biesheuvel
2016-08-03 15:38 ` [PATCH 7/8] ARM: head.S: use PC-relative insn sequences for __fixup_pv_table Ard Biesheuvel
2016-08-03 15:38 ` [PATCH 8/8] ARM: head.S: use PC relative insn sequence to calculate PHYS_OFFSET Ard Biesheuvel
2016-08-03 18:17 ` [PATCH 0/8] ARM: clean up PC-relative arithmetic Russell King - ARM Linux
2016-08-04 7:17 ` Ard Biesheuvel
2016-08-04 9:49 ` Russell King - ARM Linux
2016-08-04 9:54 ` Ard Biesheuvel
2016-08-04 10:03 ` Russell King - ARM Linux
2016-08-04 10:11 ` Ard Biesheuvel
2016-08-04 10:14 ` Russell King - ARM Linux
2016-08-03 18:27 ` Nicolas Pitre
2016-08-04 14:11 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1470238730-30038-2-git-send-email-ard.biesheuvel@linaro.org \
--to=ard.biesheuvel@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.