SYM_* macros are used to define assembly routines. In this patch series,
re-define those macros in risc-v arch specific include file to include
a landing pad instruction at the beginning. This is done only when the
compiler flag for landing pad is enabled (i.e. __riscv_zicfilp).
TODO: Update `lpad 0` with `lpad %lpad_hash(name)` after toolchain
support.
Signed-off-by: Deepak Gupta <debug@rivosinc.com>
---
arch/riscv/include/asm/linkage.h | 42 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/arch/riscv/include/asm/linkage.h b/arch/riscv/include/asm/linkage.h
index 9e88ba23cd2b..162774b81158 100644
--- a/arch/riscv/include/asm/linkage.h
+++ b/arch/riscv/include/asm/linkage.h
@@ -6,7 +6,49 @@
#ifndef _ASM_RISCV_LINKAGE_H
#define _ASM_RISCV_LINKAGE_H
+#ifdef __ASSEMBLY__
+#include <asm/assembler.h>
+#endif
+
#define __ALIGN .balign 4
#define __ALIGN_STR ".balign 4"
+#ifdef __riscv_zicfilp
+/*
+ * A landing pad instruction is needed at start of asm routines
+ * re-define macros for asm routines to have a landing pad at
+ * the beginning of function. Currently use label value of 0x1.
+ * Eventually, label should be calculated as a hash over function
+ * signature.
+ */
+#define SYM_FUNC_START(name) \
+ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
+ lpad 0;
+
+#define SYM_FUNC_START_NOALIGN(name) \
+ SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \
+ lpad 0;
+
+#define SYM_FUNC_START_LOCAL(name) \
+ SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) \
+ lpad 0;
+
+#define SYM_FUNC_START_LOCAL_NOALIGN(name) \
+ SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \
+ lpad 0;
+
+#define SYM_FUNC_START_WEAK(name) \
+ SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) \
+ lpad 0;
+
+#define SYM_FUNC_START_WEAK_NOALIGN(name) \
+ SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \
+ lpad 0;
+
+#define SYM_TYPED_FUNC_START(name) \
+ SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
+ lpad 0;
+
+#endif
+
#endif /* _ASM_RISCV_LINKAGE_H */
--
2.43.0
On Thu, Jul 24, 2025 at 04:36:54PM -0700, Deepak Gupta wrote: > SYM_* macros are used to define assembly routines. In this patch series, > re-define those macros in risc-v arch specific include file to include > a landing pad instruction at the beginning. This is done only when the > compiler flag for landing pad is enabled (i.e. __riscv_zicfilp). > > TODO: Update `lpad 0` with `lpad %lpad_hash(name)` after toolchain > support. I glanced through the proposed signature based landing pad labeling scheme, but didn't see any mentions of lpad_hash for labeling assembly functions. Is there more information somewhere about how this is going to be implemented? Sami
On Fri, Jul 25, 2025 at 03:27:45PM +0000, Sami Tolvanen wrote: >On Thu, Jul 24, 2025 at 04:36:54PM -0700, Deepak Gupta wrote: >> SYM_* macros are used to define assembly routines. In this patch series, >> re-define those macros in risc-v arch specific include file to include >> a landing pad instruction at the beginning. This is done only when the >> compiler flag for landing pad is enabled (i.e. __riscv_zicfilp). >> >> TODO: Update `lpad 0` with `lpad %lpad_hash(name)` after toolchain >> support. > >I glanced through the proposed signature based landing pad labeling >scheme, but didn't see any mentions of lpad_hash for labeling assembly >functions. Is there more information somewhere about how this is going >to be implemented? Take a look here for generation of type string https://github.com/sifive/riscv-gcc/blob/f26ae78e21e591f78802a975b68dbde9a224a192/gcc/config/riscv/riscv-func-sig.cc For hash scheme, take a look here https://github.com/sifive/riscv-binutils-gdb/commit/1d027fd590c8ad79eba997bcf9b979872ff38eef `riscv_lpad_hash` function has detail about how 20bit hash is extracted. > >Sami
On 25.07.25 01:36, Deepak Gupta wrote: > SYM_* macros are used to define assembly routines. In this patch series, > re-define those macros in risc-v arch specific include file to include > a landing pad instruction at the beginning. This is done only when the > compiler flag for landing pad is enabled (i.e. __riscv_zicfilp). > > TODO: Update `lpad 0` with `lpad %lpad_hash(name)` after toolchain > support. > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > --- > arch/riscv/include/asm/linkage.h | 42 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/arch/riscv/include/asm/linkage.h b/arch/riscv/include/asm/linkage.h > index 9e88ba23cd2b..162774b81158 100644 > --- a/arch/riscv/include/asm/linkage.h > +++ b/arch/riscv/include/asm/linkage.h > @@ -6,7 +6,49 @@ > #ifndef _ASM_RISCV_LINKAGE_H > #define _ASM_RISCV_LINKAGE_H > > +#ifdef __ASSEMBLY__ > +#include <asm/assembler.h> > +#endif > + > #define __ALIGN .balign 4 > #define __ALIGN_STR ".balign 4" > > +#ifdef __riscv_zicfilp > +/* > + * A landing pad instruction is needed at start of asm routines > + * re-define macros for asm routines to have a landing pad at > + * the beginning of function. Currently use label value of 0x1. Your code below uses label value 0 which disables tag checking. As long as we don't have tool support for calculating function hashes that is an appropriate approach. %s/Currently use label value of 0x1./Label value 0x0 disables tag checking./ Best regards Heinrich > + * Eventually, label should be calculated as a hash over function > + * signature. > + */ > +#define SYM_FUNC_START(name) \ > + SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ > + lpad 0; > + > +#define SYM_FUNC_START_NOALIGN(name) \ > + SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \ > + lpad 0; > + > +#define SYM_FUNC_START_LOCAL(name) \ > + SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) \ > + lpad 0; > + > +#define SYM_FUNC_START_LOCAL_NOALIGN(name) \ > + SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \ > + lpad 0; > + > +#define SYM_FUNC_START_WEAK(name) \ > + SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) \ > + lpad 0; > + > +#define SYM_FUNC_START_WEAK_NOALIGN(name) \ > + SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \ > + lpad 0; > + > +#define SYM_TYPED_FUNC_START(name) \ > + SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ > + lpad 0; > + > +#endif > + > #endif /* _ASM_RISCV_LINKAGE_H */ >
On Fri, Jul 25, 2025 at 08:13:29AM +0200, Heinrich Schuchardt wrote: >On 25.07.25 01:36, Deepak Gupta wrote: >>SYM_* macros are used to define assembly routines. In this patch series, >>re-define those macros in risc-v arch specific include file to include >>a landing pad instruction at the beginning. This is done only when the >>compiler flag for landing pad is enabled (i.e. __riscv_zicfilp). >> >>TODO: Update `lpad 0` with `lpad %lpad_hash(name)` after toolchain >>support. >> >>Signed-off-by: Deepak Gupta <debug@rivosinc.com> >>--- >> arch/riscv/include/asm/linkage.h | 42 ++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 42 insertions(+) >> >>diff --git a/arch/riscv/include/asm/linkage.h b/arch/riscv/include/asm/linkage.h >>index 9e88ba23cd2b..162774b81158 100644 >>--- a/arch/riscv/include/asm/linkage.h >>+++ b/arch/riscv/include/asm/linkage.h >>@@ -6,7 +6,49 @@ >> #ifndef _ASM_RISCV_LINKAGE_H >> #define _ASM_RISCV_LINKAGE_H >>+#ifdef __ASSEMBLY__ >>+#include <asm/assembler.h> >>+#endif >>+ >> #define __ALIGN .balign 4 >> #define __ALIGN_STR ".balign 4" >>+#ifdef __riscv_zicfilp >>+/* >>+ * A landing pad instruction is needed at start of asm routines >>+ * re-define macros for asm routines to have a landing pad at >>+ * the beginning of function. Currently use label value of 0x1. > >Your code below uses label value 0 which disables tag checking. As >long as we don't have tool support for calculating function hashes >that is an appropriate approach. > Yes I made the fix at other place where function prototype was determined to be static (see `call_on_irq_stack` in entry.S) In this patch, it wasn't possible. >%s/Currently use label value of 0x1./Label value 0x0 disables tag checking./ > Thanks its lingering from earlier. Will fix it. >Best regards > >Heinrich > >>+ * Eventually, label should be calculated as a hash over function >>+ * signature. >>+ */ >>+#define SYM_FUNC_START(name) \ >>+ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ >>+ lpad 0; >>+ >>+#define SYM_FUNC_START_NOALIGN(name) \ >>+ SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \ >>+ lpad 0; >>+ >>+#define SYM_FUNC_START_LOCAL(name) \ >>+ SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) \ >>+ lpad 0; >>+ >>+#define SYM_FUNC_START_LOCAL_NOALIGN(name) \ >>+ SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \ >>+ lpad 0; >>+ >>+#define SYM_FUNC_START_WEAK(name) \ >>+ SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) \ >>+ lpad 0; >>+ >>+#define SYM_FUNC_START_WEAK_NOALIGN(name) \ >>+ SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \ >>+ lpad 0; >>+ >>+#define SYM_TYPED_FUNC_START(name) \ >>+ SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ >>+ lpad 0; >>+ >>+#endif >>+ >> #endif /* _ASM_RISCV_LINKAGE_H */ >> >
© 2016 - 2025 Red Hat, Inc.