[PATCH v3 5/6] include: sbi: add emulate_load/store handler to platform ops

Anup Patel anup at brainfault.org
Sat Mar 2 05:12:20 PST 2024


On Sat, Mar 2, 2024 at 4:55 PM Bo Gan <ganboing at gmail.com> wrote:
>
> This patch allows the platform to define load/store emulators. This
> enables a platform to trap-and-emulate special devices or filter
> access to existing physical devices.
>
> Signed-off-by: Bo Gan <ganboing at gmail.com>
> ---
>  include/sbi/sbi_platform.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 2fb33e1..06247dc 100644
> --- a/include/sbi/sbi_platform.h
> +++ b/include/sbi/sbi_platform.h
> @@ -53,6 +53,8 @@ struct sbi_domain_memregion;
>  struct sbi_ecall_return;
>  struct sbi_trap_regs;
>  struct sbi_hart_features;
> +struct sbi_trap_info;
> +union sbi_reg_data;
>
>  /** Possible feature flags of a platform */
>  enum sbi_platform_features {
> @@ -139,6 +141,15 @@ struct sbi_platform_operations {
>         int (*vendor_ext_provider)(long funcid,
>                                    struct sbi_trap_regs *regs,
>                                    struct sbi_ecall_return *out);
> +
> +       /** platform specific handler to fixup load fault */
> +       int (*emulate_load)(int rlen, union sbi_reg_data *out_val,
> +                           struct sbi_trap_regs *regs,
> +                           const struct sbi_trap_info *orig_trap);
> +       /** platform specific handler to fixup store fault */
> +       int (*emulate_store)(int wlen, union sbi_reg_data in_val,
> +                            struct sbi_trap_regs *regs,
> +                            const struct sbi_trap_info *orig_trap);

This callback prototype is totally wrong. The platform code need
not be aware of sbi_trap_regs and sbi_trap_info. The generic
sbi_ldst_trap.c should not expose how load/store is emulated
to other parts of OpenSBI.

These callback prototypes should be:
       /** platform specific handler to fixup load fault */
       int (*emulate_load)(int rlen, union sbi_reg_data *out_val);
       /** platform specific handler to fixup store fault */
       int (*emulate_store)(int wlen, union sbi_reg_data in_val);

>  };
>
>  /** Platform default per-HART stack size for exception/interrupt handling */
> --
> 2.7.4
>

Regards,
Anup



More information about the opensbi mailing list