Patch "riscv: Improve sbi_ecall() code generation by reordering arguments" has been added to the 6.10-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    riscv: Improve sbi_ecall() code generation by reordering arguments

to the 6.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     riscv-improve-sbi_ecall-code-generation-by-reorderin.patch
and it can be found in the queue-6.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a1c7379d00a5c886599f723f49ffe25bd3398770
Author: Alexandre Ghiti <alexghiti@xxxxxxxxxxxx>
Date:   Fri Mar 22 12:26:29 2024 +0100

    riscv: Improve sbi_ecall() code generation by reordering arguments
    
    [ Upstream commit 16badacd8af48980c546839626d0329bab32b4c3 ]
    
    The sbi_ecall() function arguments are not in the same order as the
    ecall arguments, so we end up re-ordering the registers before the
    ecall which is useless and costly.
    
    So simply reorder the arguments in the same way as expected by ecall.
    Instead of reordering directly the arguments of sbi_ecall(), use a proxy
    macro since the current ordering is more natural.
    
    Before:
    
    Dump of assembler code for function sbi_ecall:
       0xffffffff800085e0 <+0>: add sp,sp,-32
       0xffffffff800085e2 <+2>: sd s0,24(sp)
       0xffffffff800085e4 <+4>: mv t1,a0
       0xffffffff800085e6 <+6>: add s0,sp,32
       0xffffffff800085e8 <+8>: mv t3,a1
       0xffffffff800085ea <+10>: mv a0,a2
       0xffffffff800085ec <+12>: mv a1,a3
       0xffffffff800085ee <+14>: mv a2,a4
       0xffffffff800085f0 <+16>: mv a3,a5
       0xffffffff800085f2 <+18>: mv a4,a6
       0xffffffff800085f4 <+20>: mv a5,a7
       0xffffffff800085f6 <+22>: mv a6,t3
       0xffffffff800085f8 <+24>: mv a7,t1
       0xffffffff800085fa <+26>: ecall
       0xffffffff800085fe <+30>: ld s0,24(sp)
       0xffffffff80008600 <+32>: add sp,sp,32
       0xffffffff80008602 <+34>: ret
    
    After:
    
    Dump of assembler code for function __sbi_ecall:
       0xffffffff8000b6b2 <+0>:     add     sp,sp,-32
       0xffffffff8000b6b4 <+2>:     sd      s0,24(sp)
       0xffffffff8000b6b6 <+4>:     add     s0,sp,32
       0xffffffff8000b6b8 <+6>:     ecall
       0xffffffff8000b6bc <+10>:    ld      s0,24(sp)
       0xffffffff8000b6be <+12>:    add     sp,sp,32
       0xffffffff8000b6c0 <+14>:    ret
    
    Signed-off-by: Alexandre Ghiti <alexghiti@xxxxxxxxxxxx>
    Reviewed-by: Atish Patra <atishp@xxxxxxxxxxxx>
    Reviewed-by: Yunhui Cui <cuiyunhui@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240322112629.68170-1-alexghiti@xxxxxxxxxxxx
    Signed-off-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx>
    Stable-dep-of: 1ff95eb2bebd ("riscv: Fix RISCV_ALTERNATIVE_EARLY")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h
index 1079e214fe85..7cffd4ffecd0 100644
--- a/arch/riscv/include/asm/sbi.h
+++ b/arch/riscv/include/asm/sbi.h
@@ -304,10 +304,12 @@ struct sbiret {
 };
 
 void sbi_init(void);
-struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
-			unsigned long arg1, unsigned long arg2,
-			unsigned long arg3, unsigned long arg4,
-			unsigned long arg5);
+struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1,
+			  unsigned long arg2, unsigned long arg3,
+			  unsigned long arg4, unsigned long arg5,
+			  int fid, int ext);
+#define sbi_ecall(e, f, a0, a1, a2, a3, a4, a5)	\
+		__sbi_ecall(a0, a1, a2, a3, a4, a5, f, e)
 
 #ifdef CONFIG_RISCV_SBI_V01
 void sbi_console_putchar(int ch);
diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c
index a1d21d8f5293..837bdab2601b 100644
--- a/arch/riscv/kernel/sbi.c
+++ b/arch/riscv/kernel/sbi.c
@@ -27,10 +27,10 @@ static int (*__sbi_rfence)(int fid, const struct cpumask *cpu_mask,
 			   unsigned long start, unsigned long size,
 			   unsigned long arg4, unsigned long arg5) __ro_after_init;
 
-struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
-			unsigned long arg1, unsigned long arg2,
-			unsigned long arg3, unsigned long arg4,
-			unsigned long arg5)
+struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1,
+			  unsigned long arg2, unsigned long arg3,
+			  unsigned long arg4, unsigned long arg5,
+			  int fid, int ext)
 {
 	struct sbiret ret;
 
@@ -55,7 +55,7 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
 
 	return ret;
 }
-EXPORT_SYMBOL(sbi_ecall);
+EXPORT_SYMBOL(__sbi_ecall);
 
 int sbi_err_map_linux_errno(int err)
 {




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux