diff options
author | Palmer Dabbelt <palmer@rivosinc.com> | 2022-07-21 17:19:43 -0700 |
---|---|---|
committer | Palmer Dabbelt <palmer@rivosinc.com> | 2022-07-21 17:19:43 -0700 |
commit | f4361718f7654f31fee6bf323147e7062d825599 (patch) | |
tree | 6a940a547158badfb4ee7b6019adaead4cce228d | |
parent | 3f1901110a89b0e2e13adb2ac8d1a7102879ea98 (diff) | |
parent | 9c2ea4a36364bfb5cf068c6fbea5c40292b119a5 (diff) | |
download | lwn-f4361718f7654f31fee6bf323147e7062d825599.tar.gz lwn-f4361718f7654f31fee6bf323147e7062d825599.zip |
riscv: Add macro for multiple nop instructions
Some cases need multiple nop instructions and arm64 already has a
nice helper for not needing to write all of them out but instead
use a helper to add n nops.
So add a similar thing to riscv and convert the T-Head PMA
alternative to use it.
* 'riscv-nops' of git://git.kernel.org/pub/scm/linux/kernel/git/palmer/linux.git:
riscv: convert the t-head pbmt errata to use the __nops macro
riscv: introduce nops and __nops macros for NOP sequences
-rw-r--r-- | arch/riscv/include/asm/asm.h | 15 | ||||
-rw-r--r-- | arch/riscv/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/riscv/include/asm/errata_list.h | 8 |
3 files changed, 18 insertions, 7 deletions
diff --git a/arch/riscv/include/asm/asm.h b/arch/riscv/include/asm/asm.h index 618d7c5af1a2..1b471ff73178 100644 --- a/arch/riscv/include/asm/asm.h +++ b/arch/riscv/include/asm/asm.h @@ -67,4 +67,19 @@ #error "Unexpected __SIZEOF_SHORT__" #endif +#ifdef __ASSEMBLY__ + +/* Common assembly source macros */ + +/* + * NOP sequence + */ +.macro nops, num + .rept \num + nop + .endr +.endm + +#endif /* __ASSEMBLY__ */ + #endif /* _ASM_RISCV_ASM_H */ diff --git a/arch/riscv/include/asm/barrier.h b/arch/riscv/include/asm/barrier.h index d0e24aaa2aa0..110752594228 100644 --- a/arch/riscv/include/asm/barrier.h +++ b/arch/riscv/include/asm/barrier.h @@ -13,6 +13,8 @@ #ifndef __ASSEMBLY__ #define nop() __asm__ __volatile__ ("nop") +#define __nops(n) ".rept " #n "\nnop\n.endr\n" +#define nops(n) __asm__ __volatile__ (__nops(n)) #define RISCV_FENCE(p, s) \ __asm__ __volatile__ ("fence " #p "," #s : : : "memory") diff --git a/arch/riscv/include/asm/errata_list.h b/arch/riscv/include/asm/errata_list.h index 9e2888dbb5b1..e4ee53551343 100644 --- a/arch/riscv/include/asm/errata_list.h +++ b/arch/riscv/include/asm/errata_list.h @@ -68,13 +68,7 @@ asm(ALTERNATIVE_2("li %0, 0\t\nnop", \ */ #define ALT_THEAD_PMA(_val) \ asm volatile(ALTERNATIVE( \ - "nop\n\t" \ - "nop\n\t" \ - "nop\n\t" \ - "nop\n\t" \ - "nop\n\t" \ - "nop\n\t" \ - "nop", \ + __nops(7), \ "li t3, %2\n\t" \ "slli t3, t3, %4\n\t" \ "and t3, %0, t3\n\t" \ |