qemu-riscv
[Top][All Lists]
Advanced

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

Re: [PATCH v3 3/6] target/riscv: Introduce privilege version field in th


From: Alistair Francis
Subject: Re: [PATCH v3 3/6] target/riscv: Introduce privilege version field in the CSR ops.
Date: Tue, 22 Feb 2022 07:41:15 +1000

On Sun, Feb 6, 2022 at 7:19 PM Atish Patra <atishp@rivosinc.com> wrote:
>
> To allow/disallow the CSR access based on the privilege spec, a new field
> in the csr_ops is introduced. It also adds the privileged specification
> version (v1.12) for the CSRs introduced in the v1.12. This includes the
> new ratified extensions such as Vector, Hypervisor and secconfig CSR.
>
> Signed-off-by: Atish Patra <atishp@rivosinc.com>

It might be worth mentioning that there is no enforcement in this commit

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
>  target/riscv/cpu.h |   2 +
>  target/riscv/csr.c | 103 ++++++++++++++++++++++++++++++---------------
>  2 files changed, 70 insertions(+), 35 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 60b847141db2..0741f9822cf0 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -593,6 +593,8 @@ typedef struct {
>      riscv_csr_op_fn op;
>      riscv_csr_read128_fn read128;
>      riscv_csr_write128_fn write128;
> +    /* The default priv spec version should be PRIV_VERSION_1_10_0 (i.e 0) */
> +    uint32_t min_priv_ver;
>  } riscv_csr_operations;
>
>  /* CSR function table constants */
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 8c63caa39245..25a0df498669 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -2981,13 +2981,20 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
>      [CSR_FRM]      = { "frm",      fs,     read_frm,     write_frm    },
>      [CSR_FCSR]     = { "fcsr",     fs,     read_fcsr,    write_fcsr   },
>      /* Vector CSRs */
> -    [CSR_VSTART]   = { "vstart",   vs,     read_vstart,  write_vstart },
> -    [CSR_VXSAT]    = { "vxsat",    vs,     read_vxsat,   write_vxsat  },
> -    [CSR_VXRM]     = { "vxrm",     vs,     read_vxrm,    write_vxrm   },
> -    [CSR_VCSR]     = { "vcsr",     vs,     read_vcsr,    write_vcsr   },
> -    [CSR_VL]       = { "vl",       vs,     read_vl                    },
> -    [CSR_VTYPE]    = { "vtype",    vs,     read_vtype                 },
> -    [CSR_VLENB]    = { "vlenb",    vs,     read_vlenb                 },
> +    [CSR_VSTART]   = { "vstart",   vs,    read_vstart,  write_vstart,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VXSAT]    = { "vxsat",    vs,    read_vxsat,   write_vxsat,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VXRM]     = { "vxrm",     vs,    read_vxrm,    write_vxrm,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VCSR]     = { "vcsr",     vs,    read_vcsr,    write_vcsr,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VL]       = { "vl",       vs,    read_vl,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VTYPE]    = { "vtype",    vs,    read_vtype,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
> +    [CSR_VLENB]    = { "vlenb",    vs,    read_vlenb,
> +                                          .min_priv_ver = 
> PRIV_VERSION_1_12_0 },
>      /* User Timers and Counters */
>      [CSR_CYCLE]    = { "cycle",    ctr,    read_instret  },
>      [CSR_INSTRET]  = { "instret",  ctr,    read_instret  },
> @@ -3096,33 +3103,58 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
>      [CSR_SIEH]       = { "sieh",   aia_smode32, NULL, NULL, rmw_sieh },
>      [CSR_SIPH]       = { "siph",   aia_smode32, NULL, NULL, rmw_siph },
>
> -    [CSR_HSTATUS]     = { "hstatus",     hmode,   read_hstatus,     
> write_hstatus     },
> -    [CSR_HEDELEG]     = { "hedeleg",     hmode,   read_hedeleg,     
> write_hedeleg     },
> -    [CSR_HIDELEG]     = { "hideleg",     hmode,   NULL,   NULL,     
> rmw_hideleg       },
> -    [CSR_HVIP]        = { "hvip",        hmode,   NULL,   NULL,     rmw_hvip 
>          },
> -    [CSR_HIP]         = { "hip",         hmode,   NULL,   NULL,     rmw_hip  
>          },
> -    [CSR_HIE]         = { "hie",         hmode,   NULL,   NULL,     rmw_hie  
>          },
> -    [CSR_HCOUNTEREN]  = { "hcounteren",  hmode,   read_hcounteren,  
> write_hcounteren  },
> -    [CSR_HGEIE]       = { "hgeie",       hmode,   read_hgeie,       
> write_hgeie       },
> -    [CSR_HTVAL]       = { "htval",       hmode,   read_htval,       
> write_htval       },
> -    [CSR_HTINST]      = { "htinst",      hmode,   read_htinst,      
> write_htinst      },
> -    [CSR_HGEIP]       = { "hgeip",       hmode,   read_hgeip,       NULL     
>          },
> -    [CSR_HGATP]       = { "hgatp",       hmode,   read_hgatp,       
> write_hgatp       },
> -    [CSR_HTIMEDELTA]  = { "htimedelta",  hmode,   read_htimedelta,  
> write_htimedelta  },
> -    [CSR_HTIMEDELTAH] = { "htimedeltah", hmode32, read_htimedeltah, 
> write_htimedeltah },
> -
> -    [CSR_VSSTATUS]    = { "vsstatus",    hmode,   read_vsstatus,    
> write_vsstatus    },
> -    [CSR_VSIP]        = { "vsip",        hmode,   NULL,    NULL,    rmw_vsip 
>          },
> -    [CSR_VSIE]        = { "vsie",        hmode,   NULL,    NULL,    rmw_vsie 
>          },
> -    [CSR_VSTVEC]      = { "vstvec",      hmode,   read_vstvec,      
> write_vstvec      },
> -    [CSR_VSSCRATCH]   = { "vsscratch",   hmode,   read_vsscratch,   
> write_vsscratch   },
> -    [CSR_VSEPC]       = { "vsepc",       hmode,   read_vsepc,       
> write_vsepc       },
> -    [CSR_VSCAUSE]     = { "vscause",     hmode,   read_vscause,     
> write_vscause     },
> -    [CSR_VSTVAL]      = { "vstval",      hmode,   read_vstval,      
> write_vstval      },
> -    [CSR_VSATP]       = { "vsatp",       hmode,   read_vsatp,       
> write_vsatp       },
> -
> -    [CSR_MTVAL2]      = { "mtval2",      hmode,   read_mtval2,      
> write_mtval2      },
> -    [CSR_MTINST]      = { "mtinst",      hmode,   read_mtinst,      
> write_mtinst      },
> +    [CSR_HSTATUS]     = { "hstatus",     hmode,   read_hstatus,   
> write_hstatus,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HEDELEG]     = { "hedeleg",     hmode,   read_hedeleg,   
> write_hedeleg,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HIDELEG]     = { "hideleg",     hmode,   NULL,   NULL, rmw_hideleg,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HVIP]        = { "hvip",        hmode,   NULL,   NULL,   rmw_hvip,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HIP]         = { "hip",         hmode,   NULL,   NULL,   rmw_hip,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HIE]         = { "hie",         hmode,   NULL,   NULL,    rmw_hie,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HCOUNTEREN]  = { "hcounteren",  hmode,   read_hcounteren, 
> write_hcounteren,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HGEIE]       = { "hgeie",       hmode,   read_hgeie,       
> write_hgeie,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HTVAL]       = { "htval",       hmode,   read_htval,     
> write_htval,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HTINST]      = { "htinst",      hmode,   read_htinst,    
> write_htinst,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HGEIP]       = { "hgeip",       hmode,   read_hgeip,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HGATP]       = { "hgatp",       hmode,   read_hgatp,     
> write_hgatp,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HTIMEDELTA]  = { "htimedelta",  hmode,   read_htimedelta, 
> write_htimedelta,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_HTIMEDELTAH] = { "htimedeltah", hmode32, read_htimedeltah, 
> write_htimedeltah,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +
> +    [CSR_VSSTATUS]    = { "vsstatus",    hmode,   read_vsstatus,  
> write_vsstatus,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSIP]        = { "vsip",        hmode,   NULL,    NULL,  rmw_vsip,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSIE]        = { "vsie",        hmode,   NULL,    NULL,    rmw_vsie 
> ,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSTVEC]      = { "vstvec",      hmode,   read_vstvec,    
> write_vstvec,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSSCRATCH]   = { "vsscratch",   hmode,   read_vsscratch, 
> write_vsscratch,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSEPC]       = { "vsepc",       hmode,   read_vsepc,     
> write_vsepc,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSCAUSE]     = { "vscause",     hmode,   read_vscause,   
> write_vscause,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSTVAL]      = { "vstval",      hmode,   read_vstval,    
> write_vstval,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_VSATP]       = { "vsatp",       hmode,   read_vsatp,     
> write_vsatp,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +
> +    [CSR_MTVAL2]      = { "mtval2",      hmode,   read_mtval2,    
> write_mtval2,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
> +    [CSR_MTINST]      = { "mtinst",      hmode,   read_mtinst,    
> write_mtinst,
> +                                         .min_priv_ver = PRIV_VERSION_1_12_0 
> },
>
>      /* Virtual Interrupts and Interrupt Priorities (H-extension with AIA) */
>      [CSR_HVIEN]       = { "hvien",       aia_hmode, read_zero, write_ignore 
> },
> @@ -3154,7 +3186,8 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
>      [CSR_VSIPH]       = { "vsiph",       aia_hmode32, NULL, NULL, rmw_vsiph 
> },
>
>      /* Physical Memory Protection */
> -    [CSR_MSECCFG]    = { "mseccfg",  epmp, read_mseccfg, write_mseccfg },
> +    [CSR_MSECCFG]    = { "mseccfg",  epmp, read_mseccfg, write_mseccfg,
> +                                     .min_priv_ver = PRIV_VERSION_1_12_0 },
>      [CSR_PMPCFG0]    = { "pmpcfg0",   pmp, read_pmpcfg,  write_pmpcfg  },
>      [CSR_PMPCFG1]    = { "pmpcfg1",   pmp, read_pmpcfg,  write_pmpcfg  },
>      [CSR_PMPCFG2]    = { "pmpcfg2",   pmp, read_pmpcfg,  write_pmpcfg  },
> --
> 2.30.2
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]