Call sites written in asm performing indirect call, they need to setup
label register (t2/x7) with correct label.
Currently first kernel was compiled with `-save-temps` option and
normalized function signature string is captured and then placed at the
asm callsite.
TODO: to write a macro wrapper with toolchain support.
Signed-off-by: Deepak Gupta <debug@rivosinc.com>
---
arch/riscv/kernel/entry.S | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S
index 2660faf52232..598e17e800ae 100644
--- a/arch/riscv/kernel/entry.S
+++ b/arch/riscv/kernel/entry.S
@@ -389,6 +389,7 @@ SYM_FUNC_START(call_on_irq_stack)
load_per_cpu t0, irq_stack_ptr, t1
li t1, IRQ_STACK_SIZE
add sp, t0, t1
+ lui t2, %lpad_hash("FvP7pt_regsE")
jalr a1
/* Switch back to the thread shadow call stack */
--
2.43.0
On Thu, Jul 24, 2025 at 04:36:55PM -0700, Deepak Gupta wrote: > Call sites written in asm performing indirect call, they need to setup > label register (t2/x7) with correct label. > > Currently first kernel was compiled with `-save-temps` option and > normalized function signature string is captured and then placed at the > asm callsite. > > TODO: to write a macro wrapper with toolchain support. > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > --- > arch/riscv/kernel/entry.S | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S > index 2660faf52232..598e17e800ae 100644 > --- a/arch/riscv/kernel/entry.S > +++ b/arch/riscv/kernel/entry.S > @@ -389,6 +389,7 @@ SYM_FUNC_START(call_on_irq_stack) > load_per_cpu t0, irq_stack_ptr, t1 > li t1, IRQ_STACK_SIZE > add sp, t0, t1 > + lui t2, %lpad_hash("FvP7pt_regsE") Ah, I see. The plan is to hardcode the signatures in assembly code and keep them manually in sync with C code. When we implemented KCFI, we thought this would become extremely tedious to maintain after a while. Do you have any plans to add KCFI-style __kcfi_typeid_<function> symbols that would allow labels to be determined from C type signatures instead? Sami
On Fri, Jul 25, 2025 at 03:33:51PM +0000, Sami Tolvanen wrote: >On Thu, Jul 24, 2025 at 04:36:55PM -0700, Deepak Gupta wrote: >> Call sites written in asm performing indirect call, they need to setup >> label register (t2/x7) with correct label. >> >> Currently first kernel was compiled with `-save-temps` option and >> normalized function signature string is captured and then placed at the >> asm callsite. >> >> TODO: to write a macro wrapper with toolchain support. >> >> Signed-off-by: Deepak Gupta <debug@rivosinc.com> >> --- >> arch/riscv/kernel/entry.S | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S >> index 2660faf52232..598e17e800ae 100644 >> --- a/arch/riscv/kernel/entry.S >> +++ b/arch/riscv/kernel/entry.S >> @@ -389,6 +389,7 @@ SYM_FUNC_START(call_on_irq_stack) >> load_per_cpu t0, irq_stack_ptr, t1 >> li t1, IRQ_STACK_SIZE >> add sp, t0, t1 >> + lui t2, %lpad_hash("FvP7pt_regsE") > >Ah, I see. The plan is to hardcode the signatures in assembly code and >keep them manually in sync with C code. When we implemented KCFI, we >thought this would become extremely tedious to maintain after a while. This is extremely tedious and not maintainable and primary reason (among other secondary ones) to keep this patch series as RFC. >Do you have any plans to add KCFI-style __kcfi_typeid_<function> symbols >that would allow labels to be determined from C type signatures instead? Yes something on similar lines. I have asked toolchain folks (Monk and Kito) on how best to support this. > >Sami
On 25.07.25 01:36, Deepak Gupta wrote: > Call sites written in asm performing indirect call, they need to setup > label register (t2/x7) with correct label. > > Currently first kernel was compiled with `-save-temps` option and > normalized function signature string is captured and then placed at the > asm callsite. > > TODO: to write a macro wrapper with toolchain support. > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > --- > arch/riscv/kernel/entry.S | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S > index 2660faf52232..598e17e800ae 100644 > --- a/arch/riscv/kernel/entry.S > +++ b/arch/riscv/kernel/entry.S > @@ -389,6 +389,7 @@ SYM_FUNC_START(call_on_irq_stack) > load_per_cpu t0, irq_stack_ptr, t1 > li t1, IRQ_STACK_SIZE > add sp, t0, t1 > + lui t2, %lpad_hash("FvP7pt_regsE") In patch 1 you use lpad 0 due to missing tool support for signature hashing. Wouldn't it be preferable to have a first patch series introducing landing pad support with lpad 0 and once tool support for signature hashing has landed create a second patch series using tags? Such a first patch series would not have to be an RFC but might be merged soon. Best regards Heinrich > jalr a1 > > /* Switch back to the thread shadow call stack */ >
On Fri, Jul 25, 2025 at 08:23:44AM +0200, Heinrich Schuchardt wrote: >On 25.07.25 01:36, Deepak Gupta wrote: >>Call sites written in asm performing indirect call, they need to setup >>label register (t2/x7) with correct label. >> >>Currently first kernel was compiled with `-save-temps` option and >>normalized function signature string is captured and then placed at the >>asm callsite. >> >>TODO: to write a macro wrapper with toolchain support. >> >>Signed-off-by: Deepak Gupta <debug@rivosinc.com> >>--- >> arch/riscv/kernel/entry.S | 1 + >> 1 file changed, 1 insertion(+) >> >>diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S >>index 2660faf52232..598e17e800ae 100644 >>--- a/arch/riscv/kernel/entry.S >>+++ b/arch/riscv/kernel/entry.S >>@@ -389,6 +389,7 @@ SYM_FUNC_START(call_on_irq_stack) >> load_per_cpu t0, irq_stack_ptr, t1 >> li t1, IRQ_STACK_SIZE >> add sp, t0, t1 >>+ lui t2, %lpad_hash("FvP7pt_regsE") > >In patch 1 you use lpad 0 due to missing tool support for signature hashing. > >Wouldn't it be preferable to have a first patch series introducing >landing pad support with lpad 0 and once tool support for signature >hashing has landed create a second patch series using tags? > >Such a first patch series would not have to be an RFC but might be >merged soon. It's mostly about security guarantees. Coarser grained cfi (only landing pad) has been proved many times not that effective. Kernel is a monolithic piece of code. If there is a good chance of adoption anywhere for labeled landing pads, its kernel. If it becomes a long pole, it's a possible direction to go back to unlabeled landing pad. > >Best regards > >Heinrich > >> jalr a1 >> /* Switch back to the thread shadow call stack */ >> >
© 2016 - 2025 Red Hat, Inc.