diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h index 4347059d..d414a2fb 100644 --- a/include/sbi/riscv_encoding.h +++ b/include/sbi/riscv_encoding.h @@ -383,6 +383,9 @@ #define CSR_SSTATEEN2 0x10E #define CSR_SSTATEEN3 0x10F +/* Supervisor Resource Management Configuration CSRs */ +#define CSR_SRMCFG 0x181 + /* Machine-Level Control transfer records CSRs */ #define CSR_MCTRCTL 0x34e @@ -822,6 +825,8 @@ #define SMSTATEEN0_FCSR (_ULL(1) << SMSTATEEN0_FCSR_SHIFT) #define SMSTATEEN0_CTR_SHIFT 54 #define SMSTATEEN0_CTR (_ULL(1) << SMSTATEEN0_CTR_SHIFT) +#define SMSTATEEN0_SRMCFG_SHIFT 55 +#define SMSTATEEN0_SRMCFG (_ULL(1) << SMSTATEEN0_SRMCFG_SHIFT) #define SMSTATEEN0_CONTEXT_SHIFT 57 #define SMSTATEEN0_CONTEXT (_ULL(1) << SMSTATEEN0_CONTEXT_SHIFT) #define SMSTATEEN0_IMSIC_SHIFT 58 diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h index dfbe8e4c..4aae1c50 100644 --- a/include/sbi/sbi_hart.h +++ b/include/sbi/sbi_hart.h @@ -79,6 +79,8 @@ enum sbi_hart_extensions { SBI_HART_EXT_SMCTR, /** HART has CTR S-mode CSRs */ SBI_HART_EXT_SSCTR, + /** Hart has Ssqosid extension */ + SBI_HART_EXT_SSQOSID, /** HART has Ssstateen extension **/ SBI_HART_EXT_SSSTATEEN, diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c index fb04d81d..9243e759 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -45,6 +45,8 @@ struct hart_context { unsigned long scounteren; /** Supervisor environment configuration register */ unsigned long senvcfg; + /** Supervisor resource management configuration register */ + unsigned long srmcfg; /** Reference to the owning domain */ struct sbi_domain *dom; @@ -135,6 +137,8 @@ static void switch_to_next_domain_context(struct hart_context *ctx, ctx->scounteren = csr_swap(CSR_SCOUNTEREN, dom_ctx->scounteren); if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) ctx->senvcfg = csr_swap(CSR_SENVCFG, dom_ctx->senvcfg); + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSQOSID)) + ctx->srmcfg = csr_swap(CSR_SRMCFG, dom_ctx->srmcfg); /* Save current trap state and restore target domain's trap state */ trap_ctx = sbi_trap_get_context(scratch); diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index c8b63df1..68c89b8d 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -110,6 +110,11 @@ static void mstatus_init(struct sbi_scratch *scratch) else mstateen_val &= ~SMSTATEEN0_CTR; + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSQOSID)) + mstateen_val |= SMSTATEEN0_SRMCFG; + else + mstateen_val &= ~SMSTATEEN0_SRMCFG; + csr_write64(CSR_MSTATEEN0, mstateen_val); csr_write64(CSR_MSTATEEN1, SMSTATEEN_STATEN); csr_write64(CSR_MSTATEEN2, SMSTATEEN_STATEN); @@ -724,6 +729,7 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = { __SBI_HART_EXT_DATA(ssdbltrp, SBI_HART_EXT_SSDBLTRP), __SBI_HART_EXT_DATA(smctr, SBI_HART_EXT_SMCTR), __SBI_HART_EXT_DATA(ssctr, SBI_HART_EXT_SSCTR), + __SBI_HART_EXT_DATA(ssqosid, SBI_HART_EXT_SSQOSID), __SBI_HART_EXT_DATA(ssstateen, SBI_HART_EXT_SSSTATEEN), };