[PATCH] RISC-V: Add a non-void return for sbi v02 functions

Palmer Dabbelt palmer at dabbelt.com
Fri Feb 5 02:06:35 EST 2021


On Wed, 03 Feb 2021 21:26:43 PST (-0800), Atish Patra wrote:
> SBI v0.2 functions can return an error code from SBI implementation.
> We are already processing the SBI error code and coverts it to the Linux
> error code.
>
> Propagate to the error code to the caller as well. As of now, kvm is the
> only user of these error codes.
>
> Signed-off-by: Atish Patra <atish.patra at wdc.com>
> ---
>  arch/riscv/include/asm/sbi.h | 10 +++++-----
>  arch/riscv/kernel/sbi.c      | 32 ++++++++++++++++----------------
>  2 files changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h
> index 1b26ec8e6a15..3e7141a7d11f 100644
> --- a/arch/riscv/include/asm/sbi.h
> +++ b/arch/riscv/include/asm/sbi.h
> @@ -116,13 +116,13 @@ int sbi_console_getchar(void);
>  void sbi_set_timer(uint64_t stime_value);
>  void sbi_shutdown(void);
>  void sbi_clear_ipi(void);
> -void sbi_send_ipi(const unsigned long *hart_mask);
> -void sbi_remote_fence_i(const unsigned long *hart_mask);
> -void sbi_remote_sfence_vma(const unsigned long *hart_mask,
> +int sbi_send_ipi(const unsigned long *hart_mask);
> +int sbi_remote_fence_i(const unsigned long *hart_mask);
> +int sbi_remote_sfence_vma(const unsigned long *hart_mask,
>  			   unsigned long start,
>  			   unsigned long size);
>
> -void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
> +int sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
>  				unsigned long start,
>  				unsigned long size,
>  				unsigned long asid);
> @@ -163,7 +163,7 @@ static inline unsigned long sbi_minor_version(void)
>
>  int sbi_err_map_linux_errno(int err);
>  #else /* CONFIG_RISCV_SBI */
> -static inline void sbi_remote_fence_i(const unsigned long *hart_mask) {}
> +static inline int sbi_remote_fence_i(const unsigned long *hart_mask) {}
>  static inline void sbi_init(void) {}
>  #endif /* CONFIG_RISCV_SBI */
>  #endif /* _ASM_RISCV_SBI_H */
> diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c
> index 8d60b2ebcad3..f904af48635d 100644
> --- a/arch/riscv/kernel/sbi.c
> +++ b/arch/riscv/kernel/sbi.c
> @@ -352,7 +352,7 @@ static int __sbi_rfence_v02(int fid, const unsigned long *hart_mask,
>   * sbi_set_timer() - Program the timer for next timer event.
>   * @stime_value: The value after which next timer event should fire.
>   *
> - * Return: None
> + * Return: None.
>   */
>  void sbi_set_timer(uint64_t stime_value)
>  {
> @@ -363,11 +363,11 @@ void sbi_set_timer(uint64_t stime_value)
>   * sbi_send_ipi() - Send an IPI to any hart.
>   * @hart_mask: A cpu mask containing all the target harts.
>   *
> - * Return: None
> + * Return: 0 on success, appropriate linux error code otherwise.
>   */
> -void sbi_send_ipi(const unsigned long *hart_mask)
> +int sbi_send_ipi(const unsigned long *hart_mask)
>  {
> -	__sbi_send_ipi(hart_mask);
> +	return __sbi_send_ipi(hart_mask);
>  }
>  EXPORT_SYMBOL(sbi_send_ipi);
>
> @@ -375,12 +375,12 @@ EXPORT_SYMBOL(sbi_send_ipi);
>   * sbi_remote_fence_i() - Execute FENCE.I instruction on given remote harts.
>   * @hart_mask: A cpu mask containing all the target harts.
>   *
> - * Return: None
> + * Return: 0 on success, appropriate linux error code otherwise.
>   */
> -void sbi_remote_fence_i(const unsigned long *hart_mask)
> +int sbi_remote_fence_i(const unsigned long *hart_mask)
>  {
> -	__sbi_rfence(SBI_EXT_RFENCE_REMOTE_FENCE_I,
> -		     hart_mask, 0, 0, 0, 0);
> +	return __sbi_rfence(SBI_EXT_RFENCE_REMOTE_FENCE_I,
> +			    hart_mask, 0, 0, 0, 0);
>  }
>  EXPORT_SYMBOL(sbi_remote_fence_i);
>
> @@ -391,14 +391,14 @@ EXPORT_SYMBOL(sbi_remote_fence_i);
>   * @start: Start of the virtual address
>   * @size: Total size of the virtual address range.
>   *
> - * Return: None
> + * Return: 0 on success, appropriate linux error code otherwise.
>   */
> -void sbi_remote_sfence_vma(const unsigned long *hart_mask,
> +int sbi_remote_sfence_vma(const unsigned long *hart_mask,
>  			   unsigned long start,
>  			   unsigned long size)
>  {
> -	__sbi_rfence(SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,
> -		     hart_mask, start, size, 0, 0);
> +	return __sbi_rfence(SBI_EXT_RFENCE_REMOTE_SFENCE_VMA,
> +			    hart_mask, start, size, 0, 0);
>  }
>  EXPORT_SYMBOL(sbi_remote_sfence_vma);
>
> @@ -411,15 +411,15 @@ EXPORT_SYMBOL(sbi_remote_sfence_vma);
>   * @size: Total size of the virtual address range.
>   * @asid: The value of address space identifier (ASID).
>   *
> - * Return: None
> + * Return: 0 on success, appropriate linux error code otherwise.
>   */
> -void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
> +int sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
>  				unsigned long start,
>  				unsigned long size,
>  				unsigned long asid)
>  {
> -	__sbi_rfence(SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,
> -		     hart_mask, start, size, asid, 0);
> +	return __sbi_rfence(SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID,
> +			    hart_mask, start, size, asid, 0);
>  }
>  EXPORT_SYMBOL(sbi_remote_sfence_vma_asid);

Thanks, this is on for-next.



More information about the linux-riscv mailing list