forked from Mirrors/opensbi
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
43cace6c36 | ||
![]() |
cb0f4757fc | ||
![]() |
baf6a75e3f | ||
![]() |
778949eeb8 | ||
![]() |
65a3938fad |
@@ -207,7 +207,7 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MHPMEVENT_SSCOF_MASK _ULL(0xFFFF000000000000)
|
#define MHPMEVENT_SSCOF_MASK _ULL(0xFF00000000000000)
|
||||||
|
|
||||||
#define ENVCFG_STCE (_ULL(1) << 63)
|
#define ENVCFG_STCE (_ULL(1) << 63)
|
||||||
#define ENVCFG_PBMTE (_ULL(1) << 62)
|
#define ENVCFG_PBMTE (_ULL(1) << 62)
|
||||||
|
@@ -291,7 +291,8 @@ int is_pmp_entry_mapped(unsigned long entry)
|
|||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
unsigned long log2len;
|
unsigned long log2len;
|
||||||
|
|
||||||
pmp_get(entry, &prot, &addr, &log2len);
|
if (pmp_get(entry, &prot, &addr, &log2len) != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
/* If address matching bits are non-zero, the entry is enable */
|
/* If address matching bits are non-zero, the entry is enable */
|
||||||
if (prot & PMP_A)
|
if (prot & PMP_A)
|
||||||
|
@@ -357,7 +357,7 @@ static void dbtr_trigger_enable(struct sbi_dbtr_trigger *trig)
|
|||||||
unsigned long state;
|
unsigned long state;
|
||||||
unsigned long tdata1;
|
unsigned long tdata1;
|
||||||
|
|
||||||
if (!trig && !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
if (!trig || !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
state = trig->state;
|
state = trig->state;
|
||||||
@@ -403,7 +403,7 @@ static void dbtr_trigger_disable(struct sbi_dbtr_trigger *trig)
|
|||||||
{
|
{
|
||||||
unsigned long tdata1;
|
unsigned long tdata1;
|
||||||
|
|
||||||
if (!trig && !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
if (!trig || !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tdata1 = trig->tdata1;
|
tdata1 = trig->tdata1;
|
||||||
@@ -429,7 +429,7 @@ static void dbtr_trigger_disable(struct sbi_dbtr_trigger *trig)
|
|||||||
|
|
||||||
static void dbtr_trigger_clear(struct sbi_dbtr_trigger *trig)
|
static void dbtr_trigger_clear(struct sbi_dbtr_trigger *trig)
|
||||||
{
|
{
|
||||||
if (!trig && !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
if (!trig || !(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
csr_write(CSR_TSELECT, trig->index);
|
csr_write(CSR_TSELECT, trig->index);
|
||||||
|
@@ -251,7 +251,7 @@ int sbi_fwft_init(struct sbi_scratch *scratch, bool cold_boot)
|
|||||||
|
|
||||||
fhs = fwft_get_hart_state_ptr(scratch);
|
fhs = fwft_get_hart_state_ptr(scratch);
|
||||||
if (!fhs) {
|
if (!fhs) {
|
||||||
fhs = sbi_zalloc(sizeof(fhs) + array_size(features) * sizeof(struct fwft_config));
|
fhs = sbi_zalloc(sizeof(*fhs) + array_size(features) * sizeof(struct fwft_config));
|
||||||
if (!fhs)
|
if (!fhs)
|
||||||
return SBI_ENOMEM;
|
return SBI_ENOMEM;
|
||||||
|
|
||||||
|
@@ -423,10 +423,12 @@ void __sbi_hsm_suspend_non_ret_save(struct sbi_scratch *scratch)
|
|||||||
hdata->saved_mie = csr_read(CSR_MIE);
|
hdata->saved_mie = csr_read(CSR_MIE);
|
||||||
hdata->saved_mip = csr_read(CSR_MIP) & (MIP_SSIP | MIP_STIP);
|
hdata->saved_mip = csr_read(CSR_MIP) & (MIP_SSIP | MIP_STIP);
|
||||||
hdata->saved_medeleg = csr_read(CSR_MEDELEG);
|
hdata->saved_medeleg = csr_read(CSR_MEDELEG);
|
||||||
|
if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
|
||||||
#if __riscv_xlen == 32
|
#if __riscv_xlen == 32
|
||||||
hdata->saved_menvcfgh = csr_read(CSR_MENVCFGH);
|
hdata->saved_menvcfgh = csr_read(CSR_MENVCFGH);
|
||||||
#endif
|
#endif
|
||||||
hdata->saved_menvcfg = csr_read(CSR_MENVCFG);
|
hdata->saved_menvcfg = csr_read(CSR_MENVCFG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __sbi_hsm_suspend_non_ret_restore(struct sbi_scratch *scratch)
|
static void __sbi_hsm_suspend_non_ret_restore(struct sbi_scratch *scratch)
|
||||||
@@ -434,10 +436,12 @@ static void __sbi_hsm_suspend_non_ret_restore(struct sbi_scratch *scratch)
|
|||||||
struct sbi_hsm_data *hdata = sbi_scratch_offset_ptr(scratch,
|
struct sbi_hsm_data *hdata = sbi_scratch_offset_ptr(scratch,
|
||||||
hart_data_offset);
|
hart_data_offset);
|
||||||
|
|
||||||
csr_write(CSR_MENVCFG, hdata->saved_menvcfg);
|
if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
|
||||||
|
csr_write(CSR_MENVCFG, hdata->saved_menvcfg);
|
||||||
#if __riscv_xlen == 32
|
#if __riscv_xlen == 32
|
||||||
csr_write(CSR_MENVCFGH, hdata->saved_menvcfgh);
|
csr_write(CSR_MENVCFGH, hdata->saved_menvcfgh);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
csr_write(CSR_MEDELEG, hdata->saved_medeleg);
|
csr_write(CSR_MEDELEG, hdata->saved_medeleg);
|
||||||
csr_write(CSR_MIE, hdata->saved_mie);
|
csr_write(CSR_MIE, hdata->saved_mie);
|
||||||
csr_set(CSR_MIP, (hdata->saved_mip & (MIP_SSIP | MIP_STIP)));
|
csr_set(CSR_MIP, (hdata->saved_mip & (MIP_SSIP | MIP_STIP)));
|
||||||
|
Reference in New Issue
Block a user