@@ -680,6 +680,15 @@ static RISCVException aia_hmode32(CPURISCVState *env, int csrno)
680
680
return hmode32 (env , csrno );
681
681
}
682
682
683
+ static RISCVException dbltrp_hmode (CPURISCVState * env , int csrno )
684
+ {
685
+ if (riscv_cpu_cfg (env )-> ext_ssdbltrp ) {
686
+ return RISCV_EXCP_NONE ;
687
+ }
688
+
689
+ return hmode (env , csrno );
690
+ }
691
+
683
692
static RISCVException pmp (CPURISCVState * env , int csrno )
684
693
{
685
694
if (riscv_cpu_cfg (env )-> pmp ) {
@@ -1938,6 +1947,13 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
1938
1947
mask |= MSTATUS_VS ;
1939
1948
}
1940
1949
1950
+ if (riscv_env_smode_dbltrp_enabled (env , env -> virt_enabled )) {
1951
+ mask |= MSTATUS_SDT ;
1952
+ if ((val & MSTATUS_SDT ) != 0 ) {
1953
+ val &= ~MSTATUS_SIE ;
1954
+ }
1955
+ }
1956
+
1941
1957
if (xl != MXL_RV32 || env -> debugger ) {
1942
1958
if (riscv_has_ext (env , RVH )) {
1943
1959
mask |= MSTATUS_MPV | MSTATUS_GVA ;
@@ -2959,7 +2975,8 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
2959
2975
mask |= (cfg -> ext_svpbmt ? MENVCFG_PBMTE : 0 ) |
2960
2976
(cfg -> ext_sstc ? MENVCFG_STCE : 0 ) |
2961
2977
(cfg -> ext_smcdeleg ? MENVCFG_CDE : 0 ) |
2962
- (cfg -> ext_svadu ? MENVCFG_ADUE : 0 );
2978
+ (cfg -> ext_svadu ? MENVCFG_ADUE : 0 ) |
2979
+ (cfg -> ext_ssdbltrp ? MENVCFG_DTE : 0 );
2963
2980
2964
2981
if (env_archcpu (env )-> cfg .ext_zicfilp ) {
2965
2982
mask |= MENVCFG_LPE ;
@@ -2973,6 +2990,10 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
2973
2990
if (env_archcpu (env )-> cfg .ext_smnpm &&
2974
2991
get_field (val , MENVCFG_PMM ) != PMM_FIELD_RESERVED ) {
2975
2992
mask |= MENVCFG_PMM ;
2993
+ }
2994
+
2995
+ if ((val & MENVCFG_DTE ) == 0 ) {
2996
+ env -> mstatus &= ~MSTATUS_SDT ;
2976
2997
}
2977
2998
}
2978
2999
env -> menvcfg = (env -> menvcfg & ~mask ) | (val & mask );
@@ -2997,9 +3018,14 @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
2997
3018
uint64_t mask = (cfg -> ext_svpbmt ? MENVCFG_PBMTE : 0 ) |
2998
3019
(cfg -> ext_sstc ? MENVCFG_STCE : 0 ) |
2999
3020
(cfg -> ext_svadu ? MENVCFG_ADUE : 0 ) |
3000
- (cfg -> ext_smcdeleg ? MENVCFG_CDE : 0 );
3021
+ (cfg -> ext_smcdeleg ? MENVCFG_CDE : 0 ) |
3022
+ (cfg -> ext_ssdbltrp ? MENVCFG_DTE : 0 );
3001
3023
uint64_t valh = (uint64_t )val << 32 ;
3002
3024
3025
+ if ((valh & MENVCFG_DTE ) == 0 ) {
3026
+ env -> mstatus &= ~MSTATUS_SDT ;
3027
+ }
3028
+
3003
3029
env -> menvcfg = (env -> menvcfg & ~mask ) | (valh & mask );
3004
3030
write_henvcfgh (env , CSR_HENVCFGH , env -> henvcfg >> 32 );
3005
3031
@@ -3070,9 +3096,10 @@ static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
3070
3096
* henvcfg.pbmte is read_only 0 when menvcfg.pbmte = 0
3071
3097
* henvcfg.stce is read_only 0 when menvcfg.stce = 0
3072
3098
* henvcfg.adue is read_only 0 when menvcfg.adue = 0
3099
+ * henvcfg.dte is read_only 0 when menvcfg.dte = 0
3073
3100
*/
3074
- * val = env -> henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE ) |
3075
- env -> menvcfg );
3101
+ * val = env -> henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE |
3102
+ HENVCFG_DTE ) | env -> menvcfg );
3076
3103
return RISCV_EXCP_NONE ;
3077
3104
}
3078
3105
@@ -3088,7 +3115,8 @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
3088
3115
}
3089
3116
3090
3117
if (riscv_cpu_mxl (env ) == MXL_RV64 ) {
3091
- mask |= env -> menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE );
3118
+ mask |= env -> menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE |
3119
+ HENVCFG_DTE );
3092
3120
3093
3121
if (env_archcpu (env )-> cfg .ext_zicfilp ) {
3094
3122
mask |= HENVCFG_LPE ;
@@ -3108,6 +3136,9 @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
3108
3136
}
3109
3137
3110
3138
env -> henvcfg = val & mask ;
3139
+ if ((env -> henvcfg & HENVCFG_DTE ) == 0 ) {
3140
+ env -> vsstatus &= ~MSTATUS_SDT ;
3141
+ }
3111
3142
3112
3143
return RISCV_EXCP_NONE ;
3113
3144
}
@@ -3122,25 +3153,27 @@ static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
3122
3153
return ret ;
3123
3154
}
3124
3155
3125
- * val = (env -> henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE ) |
3126
- env -> menvcfg )) >> 32 ;
3156
+ * val = (env -> henvcfg & (~(HENVCFG_PBMTE | HENVCFG_STCE | HENVCFG_ADUE |
3157
+ HENVCFG_DTE ) | env -> menvcfg )) >> 32 ;
3127
3158
return RISCV_EXCP_NONE ;
3128
3159
}
3129
3160
3130
3161
static RISCVException write_henvcfgh (CPURISCVState * env , int csrno ,
3131
3162
target_ulong val )
3132
3163
{
3133
3164
uint64_t mask = env -> menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE |
3134
- HENVCFG_ADUE );
3165
+ HENVCFG_ADUE | HENVCFG_DTE );
3135
3166
uint64_t valh = (uint64_t )val << 32 ;
3136
3167
RISCVException ret ;
3137
3168
3138
3169
ret = smstateen_acc_ok (env , 0 , SMSTATEEN0_HSENVCFG );
3139
3170
if (ret != RISCV_EXCP_NONE ) {
3140
3171
return ret ;
3141
3172
}
3142
-
3143
3173
env -> henvcfg = (env -> henvcfg & 0xFFFFFFFF ) | (valh & mask );
3174
+ if ((env -> henvcfg & HENVCFG_DTE ) == 0 ) {
3175
+ env -> vsstatus &= ~MSTATUS_SDT ;
3176
+ }
3144
3177
return RISCV_EXCP_NONE ;
3145
3178
}
3146
3179
@@ -3594,6 +3627,9 @@ static RISCVException read_sstatus_i128(CPURISCVState *env, int csrno,
3594
3627
if (env -> xl != MXL_RV32 || env -> debugger ) {
3595
3628
mask |= SSTATUS64_UXL ;
3596
3629
}
3630
+ if (riscv_cpu_cfg (env )-> ext_ssdbltrp ) {
3631
+ mask |= SSTATUS_SDT ;
3632
+ }
3597
3633
3598
3634
if (env_archcpu (env )-> cfg .ext_zicfilp ) {
3599
3635
mask |= SSTATUS_SPELP ;
@@ -3614,7 +3650,9 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
3614
3650
if (env_archcpu (env )-> cfg .ext_zicfilp ) {
3615
3651
mask |= SSTATUS_SPELP ;
3616
3652
}
3617
-
3653
+ if (riscv_cpu_cfg (env )-> ext_ssdbltrp ) {
3654
+ mask |= SSTATUS_SDT ;
3655
+ }
3618
3656
/* TODO: Use SXL not MXL. */
3619
3657
* val = add_status_sd (riscv_cpu_mxl (env ), env -> mstatus & mask );
3620
3658
return RISCV_EXCP_NONE ;
@@ -3634,7 +3672,9 @@ static RISCVException write_sstatus(CPURISCVState *env, int csrno,
3634
3672
if (env_archcpu (env )-> cfg .ext_zicfilp ) {
3635
3673
mask |= SSTATUS_SPELP ;
3636
3674
}
3637
-
3675
+ if (riscv_cpu_cfg (env )-> ext_ssdbltrp ) {
3676
+ mask |= SSTATUS_SDT ;
3677
+ }
3638
3678
target_ulong newval = (env -> mstatus & ~mask ) | (val & mask );
3639
3679
return write_mstatus (env , CSR_MSTATUS , newval );
3640
3680
}
@@ -4751,6 +4791,13 @@ static RISCVException write_vsstatus(CPURISCVState *env, int csrno,
4751
4791
if ((val & VSSTATUS64_UXL ) == 0 ) {
4752
4792
mask &= ~VSSTATUS64_UXL ;
4753
4793
}
4794
+ if ((env -> henvcfg & HENVCFG_DTE )) {
4795
+ if ((val & SSTATUS_SDT ) != 0 ) {
4796
+ val &= ~SSTATUS_SIE ;
4797
+ }
4798
+ } else {
4799
+ val &= ~SSTATUS_SDT ;
4800
+ }
4754
4801
env -> vsstatus = (env -> vsstatus & ~mask ) | (uint64_t )val ;
4755
4802
return RISCV_EXCP_NONE ;
4756
4803
}
@@ -5698,7 +5745,7 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
5698
5745
[CSR_VSATP ] = { "vsatp" , hmode , read_vsatp , write_vsatp ,
5699
5746
.min_priv_ver = PRIV_VERSION_1_12_0 },
5700
5747
5701
- [CSR_MTVAL2 ] = { "mtval2" , hmode , read_mtval2 , write_mtval2 ,
5748
+ [CSR_MTVAL2 ] = { "mtval2" , dbltrp_hmode , read_mtval2 , write_mtval2 ,
5702
5749
.min_priv_ver = PRIV_VERSION_1_12_0 },
5703
5750
[CSR_MTINST ] = { "mtinst" , hmode , read_mtinst , write_mtinst ,
5704
5751
.min_priv_ver = PRIV_VERSION_1_12_0 },
0 commit comments