@ -3181,6 +3181,7 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
const RISCVCPUConfig * cfg = riscv_cpu_cfg ( env ) ;
uint64_t mask = MENVCFG_FIOM | MENVCFG_CBIE | MENVCFG_CBCFE |
MENVCFG_CBZE | MENVCFG_CDE ;
bool stce_changed = false ;
if ( riscv_cpu_mxl ( env ) = = MXL_RV64 ) {
mask | = ( cfg - > ext_svpbmt ? MENVCFG_PBMTE : 0 ) |
@ -3206,8 +3207,18 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
if ( ( val & MENVCFG_DTE ) = = 0 ) {
env - > mstatus & = ~ MSTATUS_SDT ;
}
if ( cfg - > ext_sstc & &
( ( env - > menvcfg & MENVCFG_STCE ) ! = ( val & MENVCFG_STCE ) ) ) {
stce_changed = true ;
}
}
env - > menvcfg = ( env - > menvcfg & ~ mask ) | ( val & mask ) ;
if ( stce_changed ) {
riscv_timer_stce_changed ( env , true , ! ! ( val & MENVCFG_STCE ) ) ;
}
return write_henvcfg ( env , CSR_HENVCFG , env - > henvcfg , ra ) ;
}
@ -3230,12 +3241,23 @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
( cfg - > ext_smcdeleg ? MENVCFG_CDE : 0 ) |
( cfg - > ext_ssdbltrp ? MENVCFG_DTE : 0 ) ;
uint64_t valh = ( uint64_t ) val < < 32 ;
bool stce_changed = false ;
if ( cfg - > ext_sstc & &
( ( env - > menvcfg & MENVCFG_STCE ) ! = ( valh & MENVCFG_STCE ) ) ) {
stce_changed = true ;
}
if ( ( valh & MENVCFG_DTE ) = = 0 ) {
env - > mstatus & = ~ MSTATUS_SDT ;
}
env - > menvcfg = ( env - > menvcfg & ~ mask ) | ( valh & mask ) ;
if ( stce_changed ) {
riscv_timer_stce_changed ( env , true , ! ! ( valh & MENVCFG_STCE ) ) ;
}
return write_henvcfgh ( env , CSR_HENVCFGH , env - > henvcfg > > 32 , ra ) ;
}
@ -3313,8 +3335,10 @@ static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
static RISCVException write_henvcfg ( CPURISCVState * env , int csrno ,
target_ulong val , uintptr_t ra )
{
const RISCVCPUConfig * cfg = riscv_cpu_cfg ( env ) ;
uint64_t mask = HENVCFG_FIOM | HENVCFG_CBIE | HENVCFG_CBCFE | HENVCFG_CBZE ;
RISCVException ret ;
bool stce_changed = false ;
ret = smstateen_acc_ok ( env , 0 , SMSTATEEN0_HSENVCFG ) ;
if ( ret ! = RISCV_EXCP_NONE ) {
@ -3340,6 +3364,11 @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
get_field ( val , HENVCFG_PMM ) ! = PMM_FIELD_RESERVED ) {
mask | = HENVCFG_PMM ;
}
if ( cfg - > ext_sstc & &
( ( env - > henvcfg & HENVCFG_STCE ) ! = ( val & HENVCFG_STCE ) ) ) {
stce_changed = true ;
}
}
env - > henvcfg = val & mask ;
@ -3347,6 +3376,10 @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
env - > vsstatus & = ~ MSTATUS_SDT ;
}
if ( stce_changed ) {
riscv_timer_stce_changed ( env , false , ! ! ( val & HENVCFG_STCE ) ) ;
}
return RISCV_EXCP_NONE ;
}
@ -3368,19 +3401,32 @@ static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
static RISCVException write_henvcfgh ( CPURISCVState * env , int csrno ,
target_ulong val , uintptr_t ra )
{
const RISCVCPUConfig * cfg = riscv_cpu_cfg ( env ) ;
uint64_t mask = env - > menvcfg & ( HENVCFG_PBMTE | HENVCFG_STCE |
HENVCFG_ADUE | HENVCFG_DTE ) ;
uint64_t valh = ( uint64_t ) val < < 32 ;
RISCVException ret ;
bool stce_changed = false ;
ret = smstateen_acc_ok ( env , 0 , SMSTATEEN0_HSENVCFG ) ;
if ( ret ! = RISCV_EXCP_NONE ) {
return ret ;
}
if ( cfg - > ext_sstc & &
( ( env - > henvcfg & HENVCFG_STCE ) ! = ( valh & HENVCFG_STCE ) ) ) {
stce_changed = true ;
}
env - > henvcfg = ( env - > henvcfg & 0xFFFFFFFF ) | ( valh & mask ) ;
if ( ( env - > henvcfg & HENVCFG_DTE ) = = 0 ) {
env - > vsstatus & = ~ MSTATUS_SDT ;
}
if ( stce_changed ) {
riscv_timer_stce_changed ( env , false , ! ! ( val & HENVCFG_STCE ) ) ;
}
return RISCV_EXCP_NONE ;
}