[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] xen/riscv: fix switch_stack_and_jump() for range beyond 1M



commit 0f1ca0a3bc8d360b8ecd0231097a2e4d472838db
Author:     Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
AuthorDate: Wed Jun 3 08:16:28 2026 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jun 3 08:16:28 2026 +0200

    xen/riscv: fix switch_stack_and_jump() for range beyond 1M
    
    The `j` instruction (JAL x0) used in switch_stack_and_jump() is a
    J-type instruction with only a ±1MB range, and that this can
    be exceeded in some configurations, causing a linker error:
    
      relocation truncated to fit: R_RISCV_JAL against `<symbol>'
    
    Replace `j` with `jr` (JALR x0) via an explicit register, which has
    unlimited range.
    
    Found in a downstream branch when UBSAN instrumentation was enabled.
    
    Note that the `tail` instruction looks more natural here, but `jr` is
    chosen instead to avoid depending on how the assembler expands `tail`
    and which scratch register it uses (`t1` in GAS), which would need to
    be listed in the clobber section of `asm volatile`.
    
    Fixes: e66003e7be199 ("xen/riscv: introduce setup_initial_pages")
    Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
    Reviewed-by: Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx>
    Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
 xen/arch/riscv/include/asm/current.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xen/arch/riscv/include/asm/current.h 
b/xen/arch/riscv/include/asm/current.h
index 5fbee8182c..78ec52fd8a 100644
--- a/xen/arch/riscv/include/asm/current.h
+++ b/xen/arch/riscv/include/asm/current.h
@@ -54,7 +54,7 @@ DECLARE_PER_CPU(struct vcpu *, curr_vcpu);
 #define switch_stack_and_jump(stack, fn) do {               \
     asm volatile (                                          \
             "mv sp, %0\n"                                   \
-            "j " #fn :: "r" (stack), "X" (fn) : "memory" ); \
+            "jr %1" :: "r" (stack), "r" (fn) : "memory" );  \
     unreachable();                                          \
 } while ( false )
 
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.