2021-12-06 12:47:23

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 0/6] linkage: better symbol aliasing

This series aims to make symbol aliasing simpler and more consistent.
The basic idea is to replace SYM_FUNC_START_ALIAS(alias) and
SYM_FUNC_END_ALIAS(alias) with a new SYM_FUNC_ALIAS(alias, name), so
that e.g.

SYM_FUNC_START(func)
SYM_FUNC_START_ALIAS(alias1)
SYM_FUNC_START_ALIAS(alias2)
... asm insns ...
SYM_FUNC_END(func)
SYM_FUNC_END_ALIAS(alias1)
SYM_FUNC_END_ALIAS(alias2)
EXPORT_SYMBOL(alias1)
EXPORT_SYMBOL(alias2)

... can become:

SYM_FUNC_START(name)
... asm insns ...
SYM_FUNC_END(name)

SYM_FUNC_ALIAS(alias1, func)
EXPORT_SYMBOL(alias1)

SYM_FUNC_ALIAS(alias2, func)
EXPORT_SYMBOL(alias2)

This avoids repetition and hopefully make it easier to ensure
consistency (e.g. so each function has a single canonical name and
associated metadata).

I'm sending this as an RFC since I want to check:

a) People are happy with the idea in principle.

b) People are happy with the implementation within <linux/linkage.h>.

... and I haven't yet converted the headers under tools/, which is
largely a copy+paste job.

I've build+boot tested arm64 and x86 defconfig without issues, and I've
pushed the series to my `linkage/alias-rework` branch on git.kernel.org,
atop v5.16-rc3:

git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git linkage/alias-rework
https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=linkage/alias-rework

Thanks,
Mark.

Mark Rutland (6):
linkage: add SYM_{ENTRY,START,END}_AT()
linkage: add SYM_FUNC_{LOCAL_,}ALIAS()
arm64: remove __dma_*_area() aliases
arm64: clean up symbol aliasing
x86: clean up symbol aliasing
linkage: remove START/END ALIAS macros

Documentation/asm-annotations.rst | 11 ++--
arch/arm64/include/asm/linkage.h | 24 ---------
arch/arm64/kvm/hyp/nvhe/cache.S | 5 +-
arch/arm64/lib/clear_page.S | 5 +-
arch/arm64/lib/copy_page.S | 5 +-
arch/arm64/lib/memchr.S | 5 +-
arch/arm64/lib/memcmp.S | 6 +--
arch/arm64/lib/memcpy.S | 21 ++++----
arch/arm64/lib/memset.S | 12 +++--
arch/arm64/lib/strchr.S | 6 ++-
arch/arm64/lib/strcmp.S | 6 +--
arch/arm64/lib/strlen.S | 6 +--
arch/arm64/lib/strncmp.S | 8 +--
arch/arm64/lib/strnlen.S | 6 ++-
arch/arm64/lib/strrchr.S | 5 +-
arch/arm64/mm/cache.S | 59 +++++++++-----------
arch/x86/boot/compressed/head_32.S | 3 +-
arch/x86/boot/compressed/head_64.S | 3 +-
arch/x86/lib/memcpy_64.S | 10 ++--
arch/x86/lib/memmove_64.S | 4 +-
arch/x86/lib/memset_64.S | 6 +--
include/linux/linkage.h | 86 ++++++++++++++++++------------
22 files changed, 146 insertions(+), 156 deletions(-)

--
2.30.2



2021-12-06 12:47:27

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 1/6] linkage: add SYM_{ENTRY,START,END}_AT()

Currently, the SYM_{ENTRY,START,END}() helpers define symbols in terms
of the current position within the section. In subsequent patches we'll
need to define symbols after moving this position.

This patch splits the core out of SYM_{ENTRY,START,END}() into
SYM_{ENTRY,START,END}_AT() macros which take a location argument,
with SYM_{ENTRY,START,END}() passing the current position.

There should be no functional change as a result of this patch.

TODO:

* Handle tools/ copy

Signed-off-by: Mark Rutland <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Peter Zijlstra <[email protected]>
---
include/linux/linkage.h | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/include/linux/linkage.h b/include/linux/linkage.h
index dbf8506decca..45a4c0fcef7d 100644
--- a/include/linux/linkage.h
+++ b/include/linux/linkage.h
@@ -147,25 +147,42 @@

/* === generic annotations === */

+#ifndef SYM_ENTRY_AT
+#define SYM_ENTRY_AT(name, location, linkage, align...) \
+ linkage(name) ASM_NL \
+ .set name, location ASM_NL
+#endif
+
/* SYM_ENTRY -- use only if you have to for non-paired symbols */
#ifndef SYM_ENTRY
#define SYM_ENTRY(name, linkage, align...) \
- linkage(name) ASM_NL \
align ASM_NL \
- name:
+ SYM_ENTRY_AT(name, ., linkage, align)
+#endif
+
+/* SYM_START_AT -- use only if you have to */
+#ifndef SYM_START_AT
+#define SYM_START_AT(name, location, linkage, align...) \
+ SYM_ENTRY_AT(name, location, linkage, align)
#endif

/* SYM_START -- use only if you have to */
#ifndef SYM_START
#define SYM_START(name, linkage, align...) \
- SYM_ENTRY(name, linkage, align)
+ SYM_START_AT(name, ., linkage, align)
+#endif
+
+/* SYM_END_AT -- use only if you have to */
+#ifndef SYM_END_AT
+#define SYM_END_AT(name, location, sym_type) \
+ .type name sym_type ASM_NL \
+ .size name, location-name ASM_NL
#endif

/* SYM_END -- use only if you have to */
#ifndef SYM_END
#define SYM_END(name, sym_type) \
- .type name sym_type ASM_NL \
- .size name, .-name
+ SYM_END_AT(name, ., sym_type)
#endif

/* === code annotations === */
--
2.30.2


2021-12-06 12:47:32

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 2/6] linkage: add SYM_FUNC_{LOCAL_,}ALIAS()

Currently aliasing an asm function requires adding START and END
annotations for each name, as per Documentation/asm-annotations.rst:

SYM_FUNC_START_ALIAS(__memset)
SYM_FUNC_START(memset)
... asm insns ...
SYM_FUNC_END(memset)
SYM_FUNC_END_ALIAS(__memset)

This is more painful than necessary to maintain, especially where a
function has many aliases, some of which we may wish to define
conditionally. For example, arm64's memcpy/memmove implementation (which
uses some arch-specific SYM_*() helpers) has:

SYM_FUNC_START_ALIAS(__memmove)
SYM_FUNC_START_ALIAS_WEAK_PI(memmove)
SYM_FUNC_START_ALIAS(__memcpy)
SYM_FUNC_START_WEAK_PI(memcpy)
... asm insns ...
SYM_FUNC_END_PI(memcpy)
EXPORT_SYMBOL(memcpy)
SYM_FUNC_END_ALIAS(__memcpy)
EXPORT_SYMBOL(__memcpy)
SYM_FUNC_END_ALIAS_PI(memmove)
EXPORT_SYMBOL(memmove)
SYM_FUNC_END_ALIAS(__memmove)
EXPORT_SYMBOL(__memmove)
SYM_FUNC_START(name)

It would be much nicer if we could define the aliases *after* the
standard function definition. This would avoid the need to specify each
symbol name twice, and would make it easier to spot the canonical
function definition. This patch adds new macros to allow us to do so,
which allows the above example to be rewritten more succinctly as:

SYM_FUNC_START(__pi_memcpy)
... asm insns ...
SYM_FUNC_END(__pi_memcpy)

SYM_FUNC_ALIAS(__memcpy, __pi_memcpy)
EXPORT_SYMBOL(__memcpy)
SYM_FUNC_ALIAS_WEAK(memcpy, __memcpy)
EXPORT_SYMBOL(memcpy)

SYM_FUNC_ALIAS(__pi_memmove, __pi_memcpy)
SYM_FUNC_ALIAS(__memmove, __pi_memmove)
EXPORT_SYMBOL(__memmove)
SYM_FUNC_ALIAS_WEAK(memmove, __memmove)
EXPORT_SYMBOL(memmove)

The reduction in duplication will also make it possible to replace some
uses of WEAK with more accurate Kconfig guards, e.g.

#ifndef CONFIG_KASAN
SYM_FUNC_ALIAS(memmove, __memmove)
EXPORT_SYMBOL(memmove)
#endif

... which should make it easier to ensure that symbols are neither used
nor overidden unexpectedly.

The existing SYM_FUNC_START_ALIAS() and SYM_FUNC_START_LOCAL_ALIAS() are
marked as deprecated, and will be removed once existing users are moved
over to the new scheme.

TODO:

* Handle tools/ copy

Signed-off-by: Mark Rutland <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Peter Zijlstra <[email protected]>
---
Documentation/asm-annotations.rst | 16 ++++++++++++++--
include/linux/linkage.h | 29 +++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/Documentation/asm-annotations.rst b/Documentation/asm-annotations.rst
index f4bf0f6395fb..cdc53bf7f9bb 100644
--- a/Documentation/asm-annotations.rst
+++ b/Documentation/asm-annotations.rst
@@ -130,8 +130,20 @@ denoting a range of code via ``SYM_*_START/END`` annotations.
In fact, this kind of annotation corresponds to the now deprecated ``ENTRY``
and ``ENDPROC`` macros.

-* ``SYM_FUNC_START_ALIAS`` and ``SYM_FUNC_START_LOCAL_ALIAS`` serve for those
- who decided to have two or more names for one function. The typical use is::
+* ``SYM_FUNC_ALIAS``, ``SYM_FUNC_ALIAS_WEAK``, and ``SYM_FUNC_LOCAL_ALIAS`` can
+ be used to define multiple names for a function. The typical use is::
+
+ SYM_FUNC_START(__memset)
+ ... asm insns ...
+ SYN_FUNC_END(__memset)
+ SYM_FUNC_ALIAS(memset, __memset)
+
+ In this example, one can call ``__memset`` or ``memset`` with the same
+ result, except the debug information for the instructions is generated to
+ the object file only once -- for the non-``ALIAS`` case.
+
+* ``SYM_FUNC_START_ALIAS`` and ``SYM_FUNC_START_LOCAL_ALIAS`` are deprecated
+ ways to define two or more names for one function. The typical use is::

SYM_FUNC_START_ALIAS(__memset)
SYM_FUNC_START(memset)
diff --git a/include/linux/linkage.h b/include/linux/linkage.h
index 45a4c0fcef7d..e91e5db92b2b 100644
--- a/include/linux/linkage.h
+++ b/include/linux/linkage.h
@@ -150,6 +150,7 @@
#ifndef SYM_ENTRY_AT
#define SYM_ENTRY_AT(name, location, linkage, align...) \
linkage(name) ASM_NL \
+ .set .L____sym_entry__##name, location ASM_NL \
.set name, location ASM_NL
#endif

@@ -176,6 +177,7 @@
#ifndef SYM_END_AT
#define SYM_END_AT(name, location, sym_type) \
.type name sym_type ASM_NL \
+ .set .L____sym_end__##name, location ASM_NL \
.size name, location-name ASM_NL
#endif

@@ -292,6 +294,33 @@
SYM_END(name, SYM_T_FUNC)
#endif

+/*
+ * SYM_FUNC_LOCAL_ALIAS -- define a local alias for an existing function
+ */
+#ifndef SYM_FUNC_LOCAL_ALIAS
+#define SYM_FUNC_LOCAL_ALIAS(alias, name) \
+ SYM_START_AT(alias, .L____sym_entry__##name, SYM_L_LOCAL, SYM_A_NONE) \
+ SYM_END_AT(alias, .L____sym_end__##name, SYM_T_FUNC)
+#endif
+
+/*
+ * SYM_FUNC_ALIAS -- define a global alias for an existing function
+ */
+#ifndef SYM_FUNC_ALIAS
+#define SYM_FUNC_ALIAS(alias, name) \
+ SYM_START_AT(alias, .L____sym_entry__##name, SYM_L_GLOBAL, SYM_A_NONE) \
+ SYM_END_AT(alias, .L____sym_end__##name, SYM_T_FUNC)
+#endif
+
+/*
+ * SYM_FUNC_ALIAS_WEAK -- define a weak global alias for an existing function
+ */
+#ifndef SYM_FUNC_ALIAS_WEAK
+#define SYM_FUNC_ALIAS_WEAK(alias, name) \
+ SYM_START_AT(alias, .L____sym_entry__##name, SYM_L_WEAK, SYM_A_NONE) \
+ SYM_END_AT(alias, .L____sym_end__##name, SYM_T_FUNC)
+#endif
+
/* SYM_CODE_START -- use for non-C (special) functions */
#ifndef SYM_CODE_START
#define SYM_CODE_START(name) \
--
2.30.2


2021-12-06 12:47:34

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 3/6] arm64: remove __dma_*_area() aliases

The __dma_inv_area() and __dma_clean_area() aliases make cache.S harder
to navigate, but don't gain us anything in practice.

For clarity, let's remove them along with their redundant comments. The
only users are __dma_map_area() and __dma_unmap_area(), which need to be
position independent, and can call __pi_dcache_inval_poc() and
__pi_dcache_clean_poc() directly.

There should be no functional change as a result of this patch.

Signed-off-by: Mark Rutland <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Fuad Tabba <[email protected]>
Cc: Marc Zyngier <[email protected]>
Cc: Will Deacon <[email protected]>
---
arch/arm64/mm/cache.S | 24 +++---------------------
1 file changed, 3 insertions(+), 21 deletions(-)

diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 5051b3c1a4f1..7d0563db4201 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -140,15 +140,7 @@ SYM_FUNC_END(dcache_clean_pou)
* - start - kernel start address of region
* - end - kernel end address of region
*/
-SYM_FUNC_START_LOCAL(__dma_inv_area)
SYM_FUNC_START_PI(dcache_inval_poc)
- /* FALLTHROUGH */
-
-/*
- * __dma_inv_area(start, end)
- * - start - virtual start address of region
- * - end - virtual end address of region
- */
dcache_line_size x2, x3
sub x3, x2, #1
tst x1, x3 // end cache line aligned?
@@ -167,7 +159,6 @@ SYM_FUNC_START_PI(dcache_inval_poc)
dsb sy
ret
SYM_FUNC_END_PI(dcache_inval_poc)
-SYM_FUNC_END(__dma_inv_area)

/*
* dcache_clean_poc(start, end)
@@ -178,19 +169,10 @@ SYM_FUNC_END(__dma_inv_area)
* - start - virtual start address of region
* - end - virtual end address of region
*/
-SYM_FUNC_START_LOCAL(__dma_clean_area)
SYM_FUNC_START_PI(dcache_clean_poc)
- /* FALLTHROUGH */
-
-/*
- * __dma_clean_area(start, end)
- * - start - virtual start address of region
- * - end - virtual end address of region
- */
dcache_by_line_op cvac, sy, x0, x1, x2, x3
ret
SYM_FUNC_END_PI(dcache_clean_poc)
-SYM_FUNC_END(__dma_clean_area)

/*
* dcache_clean_pop(start, end)
@@ -232,8 +214,8 @@ SYM_FUNC_END_PI(__dma_flush_area)
SYM_FUNC_START_PI(__dma_map_area)
add x1, x0, x1
cmp w2, #DMA_FROM_DEVICE
- b.eq __dma_inv_area
- b __dma_clean_area
+ b.eq __pi_dcache_inval_poc
+ b __pi_dcache_clean_poc
SYM_FUNC_END_PI(__dma_map_area)

/*
@@ -245,6 +227,6 @@ SYM_FUNC_END_PI(__dma_map_area)
SYM_FUNC_START_PI(__dma_unmap_area)
add x1, x0, x1
cmp w2, #DMA_TO_DEVICE
- b.ne __dma_inv_area
+ b.ne __pi_dcache_inval_poc
ret
SYM_FUNC_END_PI(__dma_unmap_area)
--
2.30.2


2021-12-06 12:47:36

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 4/6] arm64: clean up symbol aliasing

Now that we have SYM_FUNC_ALIAS() and SYM_FUNC_ALIAS_WEAK(), use those
to simplify and more consistently define function aliases across
arch/arm64.

Aliases are now defined in terms of a canonical function name. For
position-independent functions I've made the __pi_<func> name the
canonical name, and defined other alises in terms of this.

The SYM_FUNC_{START,END}_PI(func) macros obscure the __pi_<func> name,
and make this hard to seatch for. The SYM_FUNC_START_WEAK_PI() macro
also obscures the fact that the __pi_<func> fymbol is global and the
<func> symbol is weak. For clarity, I have removed these macros and used
SYM_FUNC_{START,END}() directly with the __pi_<func> name.

For example:

SYM_FUNC_START_WEAK_PI(func)
... asm insns ...
SYM_FUNC_END_PI(func)
EXPORT_SYMBOL(func)

... becomes:

SYM_FUNC_START(__pi_func)
... asm insns ...
SYM_FUNC_END(__pi_func)

SYM_FUNC_ALIAS_WEAK(func, __pi_func)
EXPORT_SYMBOL(func)

For clarity, where there are multiple annotations such as
EXPORT_SYMBOL(), I've tried to keep annotations grouped by symbol. For
example, where a function has a name and an alias which are both
exported, this is organised as:

SYM_FUNC_START(func)
... asm insns ...
SYM_FUNC_END(func)
EXPORT_SYMBOL(func)

SYM_FUNC_ALAIAS(alias, func)
EXPORT_SYMBOL(alias)

For consistency with the other string functions, I've defined strrchr as
a position-independent function, as it can safely be used as such even
though we have no users today.

As we no longer use SYM_FUNC_{START,END}_ALIAS(), our local copies are
removed. The common versions will be removed by a subsequent patch.

There should be no functional change as a result of this patch.

Signed-off-by: Mark Rutland <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Will Deacon <[email protected]>
---
arch/arm64/include/asm/linkage.h | 24 ----------------------
arch/arm64/kvm/hyp/nvhe/cache.S | 5 +++--
arch/arm64/lib/clear_page.S | 5 +++--
arch/arm64/lib/copy_page.S | 5 +++--
arch/arm64/lib/memchr.S | 5 +++--
arch/arm64/lib/memcmp.S | 6 +++---
arch/arm64/lib/memcpy.S | 21 ++++++++++---------
arch/arm64/lib/memset.S | 12 ++++++-----
arch/arm64/lib/strchr.S | 6 ++++--
arch/arm64/lib/strcmp.S | 6 +++---
arch/arm64/lib/strlen.S | 6 +++---
arch/arm64/lib/strncmp.S | 8 ++++----
arch/arm64/lib/strnlen.S | 6 ++++--
arch/arm64/lib/strrchr.S | 5 +++--
arch/arm64/mm/cache.S | 35 +++++++++++++++++++-------------
15 files changed, 75 insertions(+), 80 deletions(-)

diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h
index 9906541a6861..a825b81a137a 100644
--- a/arch/arm64/include/asm/linkage.h
+++ b/arch/arm64/include/asm/linkage.h
@@ -44,28 +44,4 @@

#endif

-/*
- * Annotate a function as position independent, i.e., safe to be called before
- * the kernel virtual mapping is activated.
- */
-#define SYM_FUNC_START_PI(x) \
- SYM_FUNC_START_ALIAS(__pi_##x); \
- SYM_FUNC_START(x)
-
-#define SYM_FUNC_START_WEAK_PI(x) \
- SYM_FUNC_START_ALIAS(__pi_##x); \
- SYM_FUNC_START_WEAK(x)
-
-#define SYM_FUNC_START_WEAK_ALIAS_PI(x) \
- SYM_FUNC_START_ALIAS(__pi_##x); \
- SYM_START(x, SYM_L_WEAK, SYM_A_ALIGN)
-
-#define SYM_FUNC_END_PI(x) \
- SYM_FUNC_END(x); \
- SYM_FUNC_END_ALIAS(__pi_##x)
-
-#define SYM_FUNC_END_ALIAS_PI(x) \
- SYM_FUNC_END_ALIAS(x); \
- SYM_FUNC_END_ALIAS(__pi_##x)
-
#endif
diff --git a/arch/arm64/kvm/hyp/nvhe/cache.S b/arch/arm64/kvm/hyp/nvhe/cache.S
index 958734f4d6b0..0c367eb5f4e2 100644
--- a/arch/arm64/kvm/hyp/nvhe/cache.S
+++ b/arch/arm64/kvm/hyp/nvhe/cache.S
@@ -7,7 +7,8 @@
#include <asm/assembler.h>
#include <asm/alternative.h>

-SYM_FUNC_START_PI(dcache_clean_inval_poc)
+SYM_FUNC_START(__pi_dcache_clean_inval_poc)
dcache_by_line_op civac, sy, x0, x1, x2, x3
ret
-SYM_FUNC_END_PI(dcache_clean_inval_poc)
+SYM_FUNC_END(__pi_dcache_clean_inval_poc)
+SYM_FUNC_ALIAS(dcache_clean_inval_poc, __pi_dcache_clean_inval_poc)
diff --git a/arch/arm64/lib/clear_page.S b/arch/arm64/lib/clear_page.S
index b84b179edba3..ba20e9d16c56 100644
--- a/arch/arm64/lib/clear_page.S
+++ b/arch/arm64/lib/clear_page.S
@@ -14,7 +14,7 @@
* Parameters:
* x0 - dest
*/
-SYM_FUNC_START_PI(clear_page)
+SYM_FUNC_START(__pi_clear_page)
mrs x1, dczid_el0
and w1, w1, #0xf
mov x2, #4
@@ -25,5 +25,6 @@ SYM_FUNC_START_PI(clear_page)
tst x0, #(PAGE_SIZE - 1)
b.ne 1b
ret
-SYM_FUNC_END_PI(clear_page)
+SYM_FUNC_END(__pi_clear_page)
+SYM_FUNC_ALIAS(clear_page, __pi_clear_page)
EXPORT_SYMBOL(clear_page)
diff --git a/arch/arm64/lib/copy_page.S b/arch/arm64/lib/copy_page.S
index 29144f4cd449..c336d2ffdec5 100644
--- a/arch/arm64/lib/copy_page.S
+++ b/arch/arm64/lib/copy_page.S
@@ -17,7 +17,7 @@
* x0 - dest
* x1 - src
*/
-SYM_FUNC_START_PI(copy_page)
+SYM_FUNC_START(__pi_copy_page)
alternative_if ARM64_HAS_NO_HW_PREFETCH
// Prefetch three cache lines ahead.
prfm pldl1strm, [x1, #128]
@@ -75,5 +75,6 @@ alternative_else_nop_endif
stnp x16, x17, [x0, #112 - 256]

ret
-SYM_FUNC_END_PI(copy_page)
+SYM_FUNC_END(__pi_copy_page)
+SYM_FUNC_ALIAS(copy_page, __pi_copy_page)
EXPORT_SYMBOL(copy_page)
diff --git a/arch/arm64/lib/memchr.S b/arch/arm64/lib/memchr.S
index 7c2276fdab54..37a9f2a4f7f4 100644
--- a/arch/arm64/lib/memchr.S
+++ b/arch/arm64/lib/memchr.S
@@ -38,7 +38,7 @@

.p2align 4
nop
-SYM_FUNC_START_WEAK_PI(memchr)
+SYM_FUNC_START(__pi_memchr)
and chrin, chrin, #0xff
lsr wordcnt, cntin, #3
cbz wordcnt, L(byte_loop)
@@ -71,5 +71,6 @@ CPU_LE( rev tmp, tmp)
L(not_found):
mov result, #0
ret
-SYM_FUNC_END_PI(memchr)
+SYM_FUNC_END(__pi_memchr)
+SYM_FUNC_ALIAS_WEAK(memchr, __pi_memchr)
EXPORT_SYMBOL_NOKASAN(memchr)
diff --git a/arch/arm64/lib/memcmp.S b/arch/arm64/lib/memcmp.S
index 7d956384222f..a5ccf2c55f91 100644
--- a/arch/arm64/lib/memcmp.S
+++ b/arch/arm64/lib/memcmp.S
@@ -32,7 +32,7 @@
#define tmp1 x7
#define tmp2 x8

-SYM_FUNC_START_WEAK_PI(memcmp)
+SYM_FUNC_START(__pi_memcmp)
subs limit, limit, 8
b.lo L(less8)

@@ -134,6 +134,6 @@ L(byte_loop):
b.eq L(byte_loop)
sub result, data1w, data2w
ret
-
-SYM_FUNC_END_PI(memcmp)
+SYM_FUNC_END(__pi_memcmp)
+SYM_FUNC_ALIAS_WEAK(memcmp, __pi_memcmp)
EXPORT_SYMBOL_NOKASAN(memcmp)
diff --git a/arch/arm64/lib/memcpy.S b/arch/arm64/lib/memcpy.S
index b82fd64ee1e1..4ab48d49c451 100644
--- a/arch/arm64/lib/memcpy.S
+++ b/arch/arm64/lib/memcpy.S
@@ -57,10 +57,7 @@
The loop tail is handled by always copying 64 bytes from the end.
*/

-SYM_FUNC_START_ALIAS(__memmove)
-SYM_FUNC_START_WEAK_ALIAS_PI(memmove)
-SYM_FUNC_START_ALIAS(__memcpy)
-SYM_FUNC_START_WEAK_PI(memcpy)
+SYM_FUNC_START(__pi_memcpy)
add srcend, src, count
add dstend, dstin, count
cmp count, 128
@@ -241,12 +238,16 @@ L(copy64_from_start):
stp B_l, B_h, [dstin, 16]
stp C_l, C_h, [dstin]
ret
+SYM_FUNC_END(__pi_memcpy)

-SYM_FUNC_END_PI(memcpy)
-EXPORT_SYMBOL(memcpy)
-SYM_FUNC_END_ALIAS(__memcpy)
+SYM_FUNC_ALIAS(__memcpy, __pi_memcpy)
EXPORT_SYMBOL(__memcpy)
-SYM_FUNC_END_ALIAS_PI(memmove)
-EXPORT_SYMBOL(memmove)
-SYM_FUNC_END_ALIAS(__memmove)
+SYM_FUNC_ALIAS_WEAK(memcpy, __memcpy)
+EXPORT_SYMBOL(memcpy)
+
+SYM_FUNC_ALIAS(__pi_memmove, __pi_memcpy)
+
+SYM_FUNC_ALIAS(__memmove, __pi_memmove)
EXPORT_SYMBOL(__memmove)
+SYM_FUNC_ALIAS_WEAK(memmove, __memmove)
+EXPORT_SYMBOL(memmove)
diff --git a/arch/arm64/lib/memset.S b/arch/arm64/lib/memset.S
index a9c1c9a01ea9..a5aebe82ad73 100644
--- a/arch/arm64/lib/memset.S
+++ b/arch/arm64/lib/memset.S
@@ -42,8 +42,7 @@ dst .req x8
tmp3w .req w9
tmp3 .req x9

-SYM_FUNC_START_ALIAS(__memset)
-SYM_FUNC_START_WEAK_PI(memset)
+SYM_FUNC_START(__pi_memset)
mov dst, dstin /* Preserve return value. */
and A_lw, val, #255
orr A_lw, A_lw, A_lw, lsl #8
@@ -202,7 +201,10 @@ SYM_FUNC_START_WEAK_PI(memset)
ands count, count, zva_bits_x
b.ne .Ltail_maybe_long
ret
-SYM_FUNC_END_PI(memset)
-EXPORT_SYMBOL(memset)
-SYM_FUNC_END_ALIAS(__memset)
+SYM_FUNC_END(__pi_memset)
+
+SYM_FUNC_ALIAS(__memset, __pi_memset)
EXPORT_SYMBOL(__memset)
+
+SYM_FUNC_ALIAS_WEAK(memset, __pi_memset)
+EXPORT_SYMBOL(memset)
diff --git a/arch/arm64/lib/strchr.S b/arch/arm64/lib/strchr.S
index 1f47eae3b0d6..aecd89480684 100644
--- a/arch/arm64/lib/strchr.S
+++ b/arch/arm64/lib/strchr.S
@@ -18,7 +18,7 @@
* Returns:
* x0 - address of first occurrence of 'c' or 0
*/
-SYM_FUNC_START_WEAK(strchr)
+SYM_FUNC_START(__pi_strchr)
and w1, w1, #0xff
1: ldrb w2, [x0], #1
cmp w2, w1
@@ -28,5 +28,7 @@ SYM_FUNC_START_WEAK(strchr)
cmp w2, w1
csel x0, x0, xzr, eq
ret
-SYM_FUNC_END(strchr)
+SYM_FUNC_END(__pi_strchr)
+
+SYM_FUNC_ALIAS(strchr, __pi_strchr)
EXPORT_SYMBOL_NOKASAN(strchr)
diff --git a/arch/arm64/lib/strcmp.S b/arch/arm64/lib/strcmp.S
index 83bcad72ec97..cda7de747efc 100644
--- a/arch/arm64/lib/strcmp.S
+++ b/arch/arm64/lib/strcmp.S
@@ -41,7 +41,7 @@

/* Start of performance-critical section -- one 64B cache line. */
.align 6
-SYM_FUNC_START_WEAK_PI(strcmp)
+SYM_FUNC_START(__pi_strcmp)
eor tmp1, src1, src2
mov zeroones, #REP8_01
tst tmp1, #7
@@ -171,6 +171,6 @@ L(loop_misaligned):
L(done):
sub result, data1, data2
ret
-
-SYM_FUNC_END_PI(strcmp)
+SYM_FUNC_END(__pi_strcmp)
+SYM_FUNC_ALIAS_WEAK(strcmp, __pi_strcmp)
EXPORT_SYMBOL_NOHWKASAN(strcmp)
diff --git a/arch/arm64/lib/strlen.S b/arch/arm64/lib/strlen.S
index 1648790e91b3..4919fe81ae54 100644
--- a/arch/arm64/lib/strlen.S
+++ b/arch/arm64/lib/strlen.S
@@ -79,7 +79,7 @@
whether the first fetch, which may be misaligned, crosses a page
boundary. */

-SYM_FUNC_START_WEAK_PI(strlen)
+SYM_FUNC_START(__pi_strlen)
and tmp1, srcin, MIN_PAGE_SIZE - 1
mov zeroones, REP8_01
cmp tmp1, MIN_PAGE_SIZE - 16
@@ -208,6 +208,6 @@ L(page_cross):
csel data1, data1, tmp4, eq
csel data2, data2, tmp2, eq
b L(page_cross_entry)
-
-SYM_FUNC_END_PI(strlen)
+SYM_FUNC_END(__pi_strlen)
+SYM_FUNC_ALIAS_WEAK(strlen, __pi_strlen)
EXPORT_SYMBOL_NOKASAN(strlen)
diff --git a/arch/arm64/lib/strncmp.S b/arch/arm64/lib/strncmp.S
index e42bcfcd37e6..39b2944bb790 100644
--- a/arch/arm64/lib/strncmp.S
+++ b/arch/arm64/lib/strncmp.S
@@ -44,7 +44,7 @@
#define endloop x15
#define count mask

-SYM_FUNC_START_WEAK_PI(strncmp)
+SYM_FUNC_START(__pi_strncmp)
cbz limit, L(ret0)
eor tmp1, src1, src2
mov zeroones, #REP8_01
@@ -256,6 +256,6 @@ L(done_loop):
L(ret0):
mov result, #0
ret
-
-SYM_FUNC_END_PI(strncmp)
-EXPORT_SYMBOL_NOHWKASAN(strncmp)
+SYM_FUNC_END(__pi_strncmp)
+SYM_FUNC_ALIAS_WEAK(strncmp, __pi_strncmp)
+EXPORT_SYMBOL(strncmp)
diff --git a/arch/arm64/lib/strnlen.S b/arch/arm64/lib/strnlen.S
index b72913a99038..d5ac0e10a01d 100644
--- a/arch/arm64/lib/strnlen.S
+++ b/arch/arm64/lib/strnlen.S
@@ -47,7 +47,7 @@ limit_wd .req x14
#define REP8_7f 0x7f7f7f7f7f7f7f7f
#define REP8_80 0x8080808080808080

-SYM_FUNC_START_WEAK_PI(strnlen)
+SYM_FUNC_START(__pi_strnlen)
cbz limit, .Lhit_limit
mov zeroones, #REP8_01
bic src, srcin, #15
@@ -156,5 +156,7 @@ CPU_LE( lsr tmp2, tmp2, tmp4 ) /* Shift (tmp1 & 63). */
.Lhit_limit:
mov len, limit
ret
-SYM_FUNC_END_PI(strnlen)
+SYM_FUNC_END(__pi_strnlen)
+
+SYM_FUNC_ALIAS_WEAK(strnlen, __pi_strnlen)
EXPORT_SYMBOL_NOKASAN(strnlen)
diff --git a/arch/arm64/lib/strrchr.S b/arch/arm64/lib/strrchr.S
index 13132d1ed6d1..a5123cf0ce12 100644
--- a/arch/arm64/lib/strrchr.S
+++ b/arch/arm64/lib/strrchr.S
@@ -18,7 +18,7 @@
* Returns:
* x0 - address of last occurrence of 'c' or 0
*/
-SYM_FUNC_START_WEAK_PI(strrchr)
+SYM_FUNC_START(__pi_strrchr)
mov x3, #0
and w1, w1, #0xff
1: ldrb w2, [x0], #1
@@ -29,5 +29,6 @@ SYM_FUNC_START_WEAK_PI(strrchr)
b 1b
2: mov x0, x3
ret
-SYM_FUNC_END_PI(strrchr)
+SYM_FUNC_END(__pi_strrchr)
+SYM_FUNC_ALIAS_WEAK(strrchr, __pi_strrchr)
EXPORT_SYMBOL_NOKASAN(strrchr)
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 7d0563db4201..0ea6cc25dc66 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -107,10 +107,11 @@ SYM_FUNC_END(icache_inval_pou)
* - start - virtual start address of region
* - end - virtual end address of region
*/
-SYM_FUNC_START_PI(dcache_clean_inval_poc)
+SYM_FUNC_START(__pi_dcache_clean_inval_poc)
dcache_by_line_op civac, sy, x0, x1, x2, x3
ret
-SYM_FUNC_END_PI(dcache_clean_inval_poc)
+SYM_FUNC_END(__pi_dcache_clean_inval_poc)
+SYM_FUNC_ALIAS(dcache_clean_inval_poc, __pi_dcache_clean_inval_poc)

/*
* dcache_clean_pou(start, end)
@@ -140,7 +141,7 @@ SYM_FUNC_END(dcache_clean_pou)
* - start - kernel start address of region
* - end - kernel end address of region
*/
-SYM_FUNC_START_PI(dcache_inval_poc)
+SYM_FUNC_START(__pi_dcache_inval_poc)
dcache_line_size x2, x3
sub x3, x2, #1
tst x1, x3 // end cache line aligned?
@@ -158,7 +159,8 @@ SYM_FUNC_START_PI(dcache_inval_poc)
b.lo 2b
dsb sy
ret
-SYM_FUNC_END_PI(dcache_inval_poc)
+SYM_FUNC_END(__pi_dcache_inval_poc)
+SYM_FUNC_ALIAS(dcache_inval_poc, __pi_dcache_inval_poc)

/*
* dcache_clean_poc(start, end)
@@ -169,10 +171,11 @@ SYM_FUNC_END_PI(dcache_inval_poc)
* - start - virtual start address of region
* - end - virtual end address of region
*/
-SYM_FUNC_START_PI(dcache_clean_poc)
+SYM_FUNC_START(__pi_dcache_clean_poc)
dcache_by_line_op cvac, sy, x0, x1, x2, x3
ret
-SYM_FUNC_END_PI(dcache_clean_poc)
+SYM_FUNC_END(__pi_dcache_clean_poc)
+SYM_FUNC_ALIAS(dcache_clean_poc, __pi_dcache_clean_poc)

/*
* dcache_clean_pop(start, end)
@@ -183,13 +186,14 @@ SYM_FUNC_END_PI(dcache_clean_poc)
* - start - virtual start address of region
* - end - virtual end address of region
*/
-SYM_FUNC_START_PI(dcache_clean_pop)
+SYM_FUNC_START(__pi_dcache_clean_pop)
alternative_if_not ARM64_HAS_DCPOP
b dcache_clean_poc
alternative_else_nop_endif
dcache_by_line_op cvap, sy, x0, x1, x2, x3
ret
-SYM_FUNC_END_PI(dcache_clean_pop)
+SYM_FUNC_END(__pi_dcache_clean_pop)
+SYM_FUNC_ALIAS(dcache_clean_pop, __pi_dcache_clean_pop)

/*
* __dma_flush_area(start, size)
@@ -199,11 +203,12 @@ SYM_FUNC_END_PI(dcache_clean_pop)
* - start - virtual start address of region
* - size - size in question
*/
-SYM_FUNC_START_PI(__dma_flush_area)
+SYM_FUNC_START(__pi___dma_flush_area)
add x1, x0, x1
dcache_by_line_op civac, sy, x0, x1, x2, x3
ret
-SYM_FUNC_END_PI(__dma_flush_area)
+SYM_FUNC_END(__pi___dma_flush_area)
+SYM_FUNC_ALIAS(__dma_flush_area, __pi___dma_flush_area)

/*
* __dma_map_area(start, size, dir)
@@ -211,12 +216,13 @@ SYM_FUNC_END_PI(__dma_flush_area)
* - size - size of region
* - dir - DMA direction
*/
-SYM_FUNC_START_PI(__dma_map_area)
+SYM_FUNC_START(__pi___dma_map_area)
add x1, x0, x1
cmp w2, #DMA_FROM_DEVICE
b.eq __pi_dcache_inval_poc
b __pi_dcache_clean_poc
-SYM_FUNC_END_PI(__dma_map_area)
+SYM_FUNC_END(__pi___dma_map_area)
+SYM_FUNC_ALIAS(__dma_map_area, __pi___dma_map_area)

/*
* __dma_unmap_area(start, size, dir)
@@ -224,9 +230,10 @@ SYM_FUNC_END_PI(__dma_map_area)
* - size - size of region
* - dir - DMA direction
*/
-SYM_FUNC_START_PI(__dma_unmap_area)
+SYM_FUNC_START(__pi___dma_unmap_area)
add x1, x0, x1
cmp w2, #DMA_TO_DEVICE
b.ne __pi_dcache_inval_poc
ret
-SYM_FUNC_END_PI(__dma_unmap_area)
+SYM_FUNC_END(__pi___dma_unmap_area)
+SYM_FUNC_ALIAS(__dma_unmap_area, __pi___dma_unmap_area)
--
2.30.2


2021-12-06 12:47:41

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 5/6] x86: clean up symbol aliasing

Now that we have SYM_FUNC_ALIAS() and SYM_FUNC_ALIAS_WEAK(), use those
to simplify the definition of function aliases across arch/x86.

For clarity, where there are multiple annotations such as
EXPORT_SYMBOL(), I've tried to keep annotations grouped by symbol. For
example, where a function has a name and an alias which are both
exported, this is organised as:

SYM_FUNC_START(func)
... asm insns ...
SYM_FUNC_END(func)
EXPORT_SYMBOL(func)

SYM_FUNC_ALAIAS(alias, func)
EXPORT_SYMBOL(alias)

There there are only aliases I I have not bothered with line spacing,
e.g.

SYM_FUNC_START(func)
... asm insns ...
SYM_FUNC_END(func)
SYM_FUNC_ALAIAS(alias, func)

There should be no functional change as a result of this patch.

TODO:

* Handle tools/ copy

Signed-off-by: Mark Rutland <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
---
arch/x86/boot/compressed/head_32.S | 3 +--
arch/x86/boot/compressed/head_64.S | 3 +--
arch/x86/lib/memcpy_64.S | 10 +++++-----
arch/x86/lib/memmove_64.S | 4 ++--
arch/x86/lib/memset_64.S | 6 +++---
5 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
index 659fad53ca82..3b354eb9516d 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -152,14 +152,13 @@ SYM_FUNC_END(startup_32)

#ifdef CONFIG_EFI_STUB
SYM_FUNC_START(efi32_stub_entry)
-SYM_FUNC_START_ALIAS(efi_stub_entry)
add $0x4, %esp
movl 8(%esp), %esi /* save boot_params pointer */
call efi_main
/* efi_main returns the possibly relocated address of startup_32 */
jmp *%eax
SYM_FUNC_END(efi32_stub_entry)
-SYM_FUNC_END_ALIAS(efi_stub_entry)
+SYM_FUNC_ALIAS(efi_stub_entry, efi32_stub_entry)
#endif

.text
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 572c535cf45b..b2226321e735 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -535,7 +535,6 @@ SYM_CODE_END(startup_64)
#ifdef CONFIG_EFI_STUB
.org 0x390
SYM_FUNC_START(efi64_stub_entry)
-SYM_FUNC_START_ALIAS(efi_stub_entry)
and $~0xf, %rsp /* realign the stack */
movq %rdx, %rbx /* save boot_params pointer */
call efi_main
@@ -543,7 +542,7 @@ SYM_FUNC_START_ALIAS(efi_stub_entry)
leaq rva(startup_64)(%rax), %rax
jmp *%rax
SYM_FUNC_END(efi64_stub_entry)
-SYM_FUNC_END_ALIAS(efi_stub_entry)
+SYM_FUNC_ALIAS(efi_stub_entry, efi64_stub_entry)
#endif

.text
diff --git a/arch/x86/lib/memcpy_64.S b/arch/x86/lib/memcpy_64.S
index 1cc9da6e29c7..aa1ff84bb39e 100644
--- a/arch/x86/lib/memcpy_64.S
+++ b/arch/x86/lib/memcpy_64.S
@@ -27,8 +27,7 @@
* Output:
* rax original destination
*/
-SYM_FUNC_START_ALIAS(__memcpy)
-SYM_FUNC_START_WEAK(memcpy)
+SYM_FUNC_START(__memcpy)
ALTERNATIVE_2 "jmp memcpy_orig", "", X86_FEATURE_REP_GOOD, \
"jmp memcpy_erms", X86_FEATURE_ERMS

@@ -40,11 +39,12 @@ SYM_FUNC_START_WEAK(memcpy)
movl %edx, %ecx
rep movsb
ret
-SYM_FUNC_END(memcpy)
-SYM_FUNC_END_ALIAS(__memcpy)
-EXPORT_SYMBOL(memcpy)
+SYM_FUNC_END(__memcpy)
EXPORT_SYMBOL(__memcpy)

+SYM_FUNC_ALIAS_WEAK(memcpy, __memcpy)
+EXPORT_SYMBOL(memcpy)
+
/*
* memcpy_erms() - enhanced fast string memcpy. This is faster and
* simpler than memcpy. Use memcpy_erms when possible.
diff --git a/arch/x86/lib/memmove_64.S b/arch/x86/lib/memmove_64.S
index 64801010d312..979f8279aec1 100644
--- a/arch/x86/lib/memmove_64.S
+++ b/arch/x86/lib/memmove_64.S
@@ -24,7 +24,6 @@
* Output:
* rax: dest
*/
-SYM_FUNC_START_WEAK(memmove)
SYM_FUNC_START(__memmove)

mov %rdi, %rax
@@ -207,6 +206,7 @@ SYM_FUNC_START(__memmove)
13:
retq
SYM_FUNC_END(__memmove)
-SYM_FUNC_END_ALIAS(memmove)
EXPORT_SYMBOL(__memmove)
+
+SYM_FUNC_ALIAS_WEAK(memmove, __memmove)
EXPORT_SYMBOL(memmove)
diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S
index 9827ae267f96..cd9205848e69 100644
--- a/arch/x86/lib/memset_64.S
+++ b/arch/x86/lib/memset_64.S
@@ -17,7 +17,6 @@
*
* rax original destination
*/
-SYM_FUNC_START_WEAK(memset)
SYM_FUNC_START(__memset)
/*
* Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended
@@ -42,10 +41,11 @@ SYM_FUNC_START(__memset)
movq %r9,%rax
ret
SYM_FUNC_END(__memset)
-SYM_FUNC_END_ALIAS(memset)
-EXPORT_SYMBOL(memset)
EXPORT_SYMBOL(__memset)

+SYM_FUNC_ALIAS_WEAK(memset, __memset)
+EXPORT_SYMBOL(memset)
+
/*
* ISO C memset - set a memory block to a byte value. This function uses
* enhanced rep stosb to override the fast string function.
--
2.30.2


2021-12-06 12:47:47

by Mark Rutland

[permalink] [raw]
Subject: [RFC PATCH 6/6] linkage: remove START/END ALIAS macros

Now that all aliases are defined using SYM_FUNC_ALIAS(), remove the old
SYM_FUNC_{START,END}_ALIAS() macros.

TODO:

* Handle tools/ copy

Signed-off-by: Mark Rutland <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Peter Zijlstra <[email protected]>
---
Documentation/asm-annotations.rst | 13 -------------
include/linux/linkage.h | 30 ------------------------------
2 files changed, 43 deletions(-)

diff --git a/Documentation/asm-annotations.rst b/Documentation/asm-annotations.rst
index cdc53bf7f9bb..ff7ecc43ca35 100644
--- a/Documentation/asm-annotations.rst
+++ b/Documentation/asm-annotations.rst
@@ -142,19 +142,6 @@ denoting a range of code via ``SYM_*_START/END`` annotations.
result, except the debug information for the instructions is generated to
the object file only once -- for the non-``ALIAS`` case.

-* ``SYM_FUNC_START_ALIAS`` and ``SYM_FUNC_START_LOCAL_ALIAS`` are deprecated
- ways to define two or more names for one function. The typical use is::
-
- SYM_FUNC_START_ALIAS(__memset)
- SYM_FUNC_START(memset)
- ... asm insns ...
- SYM_FUNC_END(memset)
- SYM_FUNC_END_ALIAS(__memset)
-
- In this example, one can call ``__memset`` or ``memset`` with the same
- result, except the debug information for the instructions is generated to
- the object file only once -- for the non-``ALIAS`` case.
-
* ``SYM_CODE_START`` and ``SYM_CODE_START_LOCAL`` should be used only in
special cases -- if you know what you are doing. This is used exclusively
for interrupt handlers and similar where the calling convention is not the C
diff --git a/include/linux/linkage.h b/include/linux/linkage.h
index e91e5db92b2b..813e4f37586b 100644
--- a/include/linux/linkage.h
+++ b/include/linux/linkage.h
@@ -219,30 +219,8 @@
SYM_ENTRY(name, linkage, SYM_A_NONE)
#endif

-/*
- * SYM_FUNC_START_LOCAL_ALIAS -- use where there are two local names for one
- * function
- */
-#ifndef SYM_FUNC_START_LOCAL_ALIAS
-#define SYM_FUNC_START_LOCAL_ALIAS(name) \
- SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
-#endif
-
-/*
- * SYM_FUNC_START_ALIAS -- use where there are two global names for one
- * function
- */
-#ifndef SYM_FUNC_START_ALIAS
-#define SYM_FUNC_START_ALIAS(name) \
- SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
-#endif
-
/* SYM_FUNC_START -- use for global functions */
#ifndef SYM_FUNC_START
-/*
- * The same as SYM_FUNC_START_ALIAS, but we will need to distinguish these two
- * later.
- */
#define SYM_FUNC_START(name) \
SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
#endif
@@ -255,7 +233,6 @@

/* SYM_FUNC_START_LOCAL -- use for local functions */
#ifndef SYM_FUNC_START_LOCAL
-/* the same as SYM_FUNC_START_LOCAL_ALIAS, see comment near SYM_FUNC_START */
#define SYM_FUNC_START_LOCAL(name) \
SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
#endif
@@ -278,18 +255,11 @@
SYM_START(name, SYM_L_WEAK, SYM_A_NONE)
#endif

-/* SYM_FUNC_END_ALIAS -- the end of LOCAL_ALIASed or ALIASed function */
-#ifndef SYM_FUNC_END_ALIAS
-#define SYM_FUNC_END_ALIAS(name) \
- SYM_END(name, SYM_T_FUNC)
-#endif
-
/*
* SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
* SYM_FUNC_START_WEAK, ...
*/
#ifndef SYM_FUNC_END
-/* the same as SYM_FUNC_END_ALIAS, see comment near SYM_FUNC_START */
#define SYM_FUNC_END(name) \
SYM_END(name, SYM_T_FUNC)
#endif
--
2.30.2


2021-12-06 14:07:38

by Ard Biesheuvel

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, 6 Dec 2021 at 13:47, Mark Rutland <[email protected]> wrote:
>
> This series aims to make symbol aliasing simpler and more consistent.
> The basic idea is to replace SYM_FUNC_START_ALIAS(alias) and
> SYM_FUNC_END_ALIAS(alias) with a new SYM_FUNC_ALIAS(alias, name), so
> that e.g.
>
> SYM_FUNC_START(func)
> SYM_FUNC_START_ALIAS(alias1)
> SYM_FUNC_START_ALIAS(alias2)
> ... asm insns ...
> SYM_FUNC_END(func)
> SYM_FUNC_END_ALIAS(alias1)
> SYM_FUNC_END_ALIAS(alias2)
> EXPORT_SYMBOL(alias1)
> EXPORT_SYMBOL(alias2)
>
> ... can become:
>
> SYM_FUNC_START(name)
> ... asm insns ...
> SYM_FUNC_END(name)
>
> SYM_FUNC_ALIAS(alias1, func)
> EXPORT_SYMBOL(alias1)
>
> SYM_FUNC_ALIAS(alias2, func)
> EXPORT_SYMBOL(alias2)
>
> This avoids repetition and hopefully make it easier to ensure
> consistency (e.g. so each function has a single canonical name and
> associated metadata).
>
> I'm sending this as an RFC since I want to check:
>
> a) People are happy with the idea in principle.
>
> b) People are happy with the implementation within <linux/linkage.h>.
>
> ... and I haven't yet converted the headers under tools/, which is
> largely a copy+paste job.
>
> I've build+boot tested arm64 and x86 defconfig without issues, and I've
> pushed the series to my `linkage/alias-rework` branch on git.kernel.org,
> atop v5.16-rc3:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git linkage/alias-rework
> https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=linkage/alias-rework
>
> Thanks,
> Mark.
>
> Mark Rutland (6):
> linkage: add SYM_{ENTRY,START,END}_AT()
> linkage: add SYM_FUNC_{LOCAL_,}ALIAS()
> arm64: remove __dma_*_area() aliases
> arm64: clean up symbol aliasing
> x86: clean up symbol aliasing
> linkage: remove START/END ALIAS macros
>

I never understood why we had these start/end markers in the first
place for alias definitions, so good riddance.

Acked-by: Ard Biesheuvel <[email protected]>


> Documentation/asm-annotations.rst | 11 ++--
> arch/arm64/include/asm/linkage.h | 24 ---------
> arch/arm64/kvm/hyp/nvhe/cache.S | 5 +-
> arch/arm64/lib/clear_page.S | 5 +-
> arch/arm64/lib/copy_page.S | 5 +-
> arch/arm64/lib/memchr.S | 5 +-
> arch/arm64/lib/memcmp.S | 6 +--
> arch/arm64/lib/memcpy.S | 21 ++++----
> arch/arm64/lib/memset.S | 12 +++--
> arch/arm64/lib/strchr.S | 6 ++-
> arch/arm64/lib/strcmp.S | 6 +--
> arch/arm64/lib/strlen.S | 6 +--
> arch/arm64/lib/strncmp.S | 8 +--
> arch/arm64/lib/strnlen.S | 6 ++-
> arch/arm64/lib/strrchr.S | 5 +-
> arch/arm64/mm/cache.S | 59 +++++++++-----------
> arch/x86/boot/compressed/head_32.S | 3 +-
> arch/x86/boot/compressed/head_64.S | 3 +-
> arch/x86/lib/memcpy_64.S | 10 ++--
> arch/x86/lib/memmove_64.S | 4 +-
> arch/x86/lib/memset_64.S | 6 +--
> include/linux/linkage.h | 86 ++++++++++++++++++------------
> 22 files changed, 146 insertions(+), 156 deletions(-)
>
> --
> 2.30.2
>

2021-12-06 15:20:04

by Mark Brown

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, Dec 06, 2021 at 03:06:44PM +0100, Ard Biesheuvel wrote:

> I never understood why we had these start/end markers in the first
> place for alias definitions, so good riddance.

> Acked-by: Ard Biesheuvel <[email protected]>

What Ard said:

Acked-by: Mark Brown <[email protected]>


Attachments:
(No filename) (288.00 B)
signature.asc (488.00 B)
Download all attachments

2021-12-07 05:23:16

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, Dec 06, 2021 at 12:47:09PM +0000, Mark Rutland wrote:
> This avoids repetition and hopefully make it easier to ensure
> consistency (e.g. so each function has a single canonical name and
> associated metadata).
>
> I'm sending this as an RFC since I want to check:
>
> a) People are happy with the idea in principle.
>
> b) People are happy with the implementation within <linux/linkage.h>.
>
> ... and I haven't yet converted the headers under tools/, which is
> largely a copy+paste job.

Looks like a definite improvement to me.

The only suggestion I'd have would be to fix a minor naming
inconsistency: change "SYM_FUNC_LOCAL_ALIAS" to "SYM_FUNC_ALIAS_LOCAL"
to match the other "<noun>_<verb>" macros.

--
Josh


2021-12-07 13:33:57

by Mark Rutland

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, Dec 06, 2021 at 09:23:04PM -0800, Josh Poimboeuf wrote:
> On Mon, Dec 06, 2021 at 12:47:09PM +0000, Mark Rutland wrote:
> > This avoids repetition and hopefully make it easier to ensure
> > consistency (e.g. so each function has a single canonical name and
> > associated metadata).
> >
> > I'm sending this as an RFC since I want to check:
> >
> > a) People are happy with the idea in principle.
> >
> > b) People are happy with the implementation within <linux/linkage.h>.
> >
> > ... and I haven't yet converted the headers under tools/, which is
> > largely a copy+paste job.
>
> Looks like a definite improvement to me.
>
> The only suggestion I'd have would be to fix a minor naming
> inconsistency: change "SYM_FUNC_LOCAL_ALIAS" to "SYM_FUNC_ALIAS_LOCAL"
> to match the other "<noun>_<verb>" macros.

Sure; I was following the example set by `SYM_FUNC_START_LOCAL_ALIAS`, but I
agree that placing LOCAL on the end looks more consistent overall once that's
removed.

For V2 I'll make that `SYM_FUNC_ALIAS_LOCAL`.

Thanks,
Mark.

2021-12-10 15:02:51

by Catalin Marinas

[permalink] [raw]
Subject: Re: [RFC PATCH 3/6] arm64: remove __dma_*_area() aliases

On Mon, Dec 06, 2021 at 12:47:12PM +0000, Mark Rutland wrote:
> The __dma_inv_area() and __dma_clean_area() aliases make cache.S harder
> to navigate, but don't gain us anything in practice.
>
> For clarity, let's remove them along with their redundant comments. The
> only users are __dma_map_area() and __dma_unmap_area(), which need to be
> position independent, and can call __pi_dcache_inval_poc() and
> __pi_dcache_clean_poc() directly.
>
> There should be no functional change as a result of this patch.
>
> Signed-off-by: Mark Rutland <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> Cc: Catalin Marinas <[email protected]>
> Cc: Fuad Tabba <[email protected]>
> Cc: Marc Zyngier <[email protected]>
> Cc: Will Deacon <[email protected]>

Acked-by: Catalin Marinas <[email protected]>

2021-12-10 15:03:17

by Catalin Marinas

[permalink] [raw]
Subject: Re: [RFC PATCH 4/6] arm64: clean up symbol aliasing

On Mon, Dec 06, 2021 at 12:47:13PM +0000, Mark Rutland wrote:
> Now that we have SYM_FUNC_ALIAS() and SYM_FUNC_ALIAS_WEAK(), use those
> to simplify and more consistently define function aliases across
> arch/arm64.
>
> Aliases are now defined in terms of a canonical function name. For
> position-independent functions I've made the __pi_<func> name the
> canonical name, and defined other alises in terms of this.
>
> The SYM_FUNC_{START,END}_PI(func) macros obscure the __pi_<func> name,
> and make this hard to seatch for. The SYM_FUNC_START_WEAK_PI() macro
> also obscures the fact that the __pi_<func> fymbol is global and the
> <func> symbol is weak. For clarity, I have removed these macros and used
> SYM_FUNC_{START,END}() directly with the __pi_<func> name.
>
> For example:
>
> SYM_FUNC_START_WEAK_PI(func)
> ... asm insns ...
> SYM_FUNC_END_PI(func)
> EXPORT_SYMBOL(func)
>
> ... becomes:
>
> SYM_FUNC_START(__pi_func)
> ... asm insns ...
> SYM_FUNC_END(__pi_func)
>
> SYM_FUNC_ALIAS_WEAK(func, __pi_func)
> EXPORT_SYMBOL(func)
>
> For clarity, where there are multiple annotations such as
> EXPORT_SYMBOL(), I've tried to keep annotations grouped by symbol. For
> example, where a function has a name and an alias which are both
> exported, this is organised as:
>
> SYM_FUNC_START(func)
> ... asm insns ...
> SYM_FUNC_END(func)
> EXPORT_SYMBOL(func)
>
> SYM_FUNC_ALAIAS(alias, func)
> EXPORT_SYMBOL(alias)
>
> For consistency with the other string functions, I've defined strrchr as
> a position-independent function, as it can safely be used as such even
> though we have no users today.
>
> As we no longer use SYM_FUNC_{START,END}_ALIAS(), our local copies are
> removed. The common versions will be removed by a subsequent patch.
>
> There should be no functional change as a result of this patch.
>
> Signed-off-by: Mark Rutland <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> Cc: Catalin Marinas <[email protected]>
> Cc: Mark Brown <[email protected]>
> Cc: Will Deacon <[email protected]>

Acked-by: Catalin Marinas <[email protected]>

2021-12-10 15:04:57

by Catalin Marinas

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, Dec 06, 2021 at 12:47:09PM +0000, Mark Rutland wrote:
> This series aims to make symbol aliasing simpler and more consistent.
> The basic idea is to replace SYM_FUNC_START_ALIAS(alias) and
> SYM_FUNC_END_ALIAS(alias) with a new SYM_FUNC_ALIAS(alias, name), so
> that e.g.
>
> SYM_FUNC_START(func)
> SYM_FUNC_START_ALIAS(alias1)
> SYM_FUNC_START_ALIAS(alias2)
> ... asm insns ...
> SYM_FUNC_END(func)
> SYM_FUNC_END_ALIAS(alias1)
> SYM_FUNC_END_ALIAS(alias2)
> EXPORT_SYMBOL(alias1)
> EXPORT_SYMBOL(alias2)
>
> ... can become:
>
> SYM_FUNC_START(name)
> ... asm insns ...
> SYM_FUNC_END(name)
>
> SYM_FUNC_ALIAS(alias1, func)
> EXPORT_SYMBOL(alias1)
>
> SYM_FUNC_ALIAS(alias2, func)
> EXPORT_SYMBOL(alias2)
>
> This avoids repetition and hopefully make it easier to ensure
> consistency (e.g. so each function has a single canonical name and
> associated metadata).
>
> I'm sending this as an RFC since I want to check:
>
> a) People are happy with the idea in principle.
>
> b) People are happy with the implementation within <linux/linkage.h>.
>
> ... and I haven't yet converted the headers under tools/, which is
> largely a copy+paste job.

I'm happy with the approach and acked the arm64 patches for the record.
Not sure how/when this series will get into mainline.

--
Catalin

2021-12-15 09:24:34

by Mark Rutland

[permalink] [raw]
Subject: Re: [RFC PATCH 0/6] linkage: better symbol aliasing

On Fri, Dec 10, 2021 at 03:04:45PM +0000, Catalin Marinas wrote:
> On Mon, Dec 06, 2021 at 12:47:09PM +0000, Mark Rutland wrote:
> > This series aims to make symbol aliasing simpler and more consistent.
> > The basic idea is to replace SYM_FUNC_START_ALIAS(alias) and
> > SYM_FUNC_END_ALIAS(alias) with a new SYM_FUNC_ALIAS(alias, name), so
> > that e.g.
> >
> > SYM_FUNC_START(func)
> > SYM_FUNC_START_ALIAS(alias1)
> > SYM_FUNC_START_ALIAS(alias2)
> > ... asm insns ...
> > SYM_FUNC_END(func)
> > SYM_FUNC_END_ALIAS(alias1)
> > SYM_FUNC_END_ALIAS(alias2)
> > EXPORT_SYMBOL(alias1)
> > EXPORT_SYMBOL(alias2)
> >
> > ... can become:
> >
> > SYM_FUNC_START(name)
> > ... asm insns ...
> > SYM_FUNC_END(name)
> >
> > SYM_FUNC_ALIAS(alias1, func)
> > EXPORT_SYMBOL(alias1)
> >
> > SYM_FUNC_ALIAS(alias2, func)
> > EXPORT_SYMBOL(alias2)
> >
> > This avoids repetition and hopefully make it easier to ensure
> > consistency (e.g. so each function has a single canonical name and
> > associated metadata).
> >
> > I'm sending this as an RFC since I want to check:
> >
> > a) People are happy with the idea in principle.
> >
> > b) People are happy with the implementation within <linux/linkage.h>.
> >
> > ... and I haven't yet converted the headers under tools/, which is
> > largely a copy+paste job.
>
> I'm happy with the approach and acked the arm64 patches for the record.
> Not sure how/when this series will get into mainline.

Thanks!

As to "when", I think I'm going to rework the series atop v5.17-rc1, so for now
would you be happy to pick patch 3 ("arm64: remove __dma_*_area() aliases"):

https://lore.kernel.org/linux-arm-kernel/[email protected]/

... into the arm64 tree? That'a a pure cleanup with no dependency on the rest
of the series.

For the rest of the series I still need to to the mechanical work for tools/,
there's a token-pasting issue on 32-bit arm, and I'd like to give this a long
soak in -next, so earlier in the next window seems like a better bet.

As for "how", I assume the core linkage bits will go via the tip tree, so I
think it'd make sense for the (remaining) arch bits to go that way too.

Thanks,
Mark.

2021-12-15 11:28:16

by Catalin Marinas

[permalink] [raw]
Subject: Re: (subset) [RFC PATCH 0/6] linkage: better symbol aliasing

On Mon, 6 Dec 2021 12:47:09 +0000, Mark Rutland wrote:
> This series aims to make symbol aliasing simpler and more consistent.
> The basic idea is to replace SYM_FUNC_START_ALIAS(alias) and
> SYM_FUNC_END_ALIAS(alias) with a new SYM_FUNC_ALIAS(alias, name), so
> that e.g.
>
> SYM_FUNC_START(func)
> SYM_FUNC_START_ALIAS(alias1)
> SYM_FUNC_START_ALIAS(alias2)
> ... asm insns ...
> SYM_FUNC_END(func)
> SYM_FUNC_END_ALIAS(alias1)
> SYM_FUNC_END_ALIAS(alias2)
> EXPORT_SYMBOL(alias1)
> EXPORT_SYMBOL(alias2)
>
> [...]

Applied to arm64 (for-next/misc), thanks!

[3/6] arm64: remove __dma_*_area() aliases
https://git.kernel.org/arm64/c/c2c529b27ceb

--
Catalin