mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00
Introduce HAS_MFAULTS_DELEGATION feature
Conditionnally delegate page fault exceptions from M mode to S mode based on the platform features. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
This commit is contained in:

committed by
Anup Patel

parent
db6c1fe78b
commit
27332e63fa
@@ -18,13 +18,15 @@ enum sbi_platform_features {
|
|||||||
SBI_PLATFORM_HAS_PMP = (1 << 2),
|
SBI_PLATFORM_HAS_PMP = (1 << 2),
|
||||||
SBI_PLATFORM_HAS_SCOUNTEREN = (1 << 3),
|
SBI_PLATFORM_HAS_SCOUNTEREN = (1 << 3),
|
||||||
SBI_PLATFORM_HAS_MCOUNTEREN = (1 << 4),
|
SBI_PLATFORM_HAS_MCOUNTEREN = (1 << 4),
|
||||||
|
SBI_PLATFORM_HAS_MFAULTS_DELEGATION = (1 << 5),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SBI_PLATFORM_DEFAULT_FEATURES \
|
#define SBI_PLATFORM_DEFAULT_FEATURES \
|
||||||
(SBI_PLATFORM_HAS_MMIO_TIMER_VALUE | \
|
(SBI_PLATFORM_HAS_MMIO_TIMER_VALUE | \
|
||||||
SBI_PLATFORM_HAS_PMP | \
|
SBI_PLATFORM_HAS_PMP | \
|
||||||
SBI_PLATFORM_HAS_SCOUNTEREN | \
|
SBI_PLATFORM_HAS_SCOUNTEREN | \
|
||||||
SBI_PLATFORM_HAS_MCOUNTEREN)
|
SBI_PLATFORM_HAS_MCOUNTEREN | \
|
||||||
|
SBI_PLATFORM_HAS_MFAULTS_DELEGATION)
|
||||||
|
|
||||||
struct sbi_platform {
|
struct sbi_platform {
|
||||||
char name[64];
|
char name[64];
|
||||||
@@ -71,6 +73,8 @@ struct sbi_platform {
|
|||||||
((__p)->features & SBI_PLATFORM_HAS_SCOUNTEREN)
|
((__p)->features & SBI_PLATFORM_HAS_SCOUNTEREN)
|
||||||
#define sbi_platform_has_mcounteren(__p) \
|
#define sbi_platform_has_mcounteren(__p) \
|
||||||
((__p)->features & SBI_PLATFORM_HAS_MCOUNTEREN)
|
((__p)->features & SBI_PLATFORM_HAS_MCOUNTEREN)
|
||||||
|
#define sbi_platform_has_mfaults_delegation(__p) \
|
||||||
|
((__p)->features & SBI_PLATFORM_HAS_MFAULTS_DELEGATION)
|
||||||
|
|
||||||
static inline const char *sbi_platform_name(struct sbi_platform *plat)
|
static inline const char *sbi_platform_name(struct sbi_platform *plat)
|
||||||
{
|
{
|
||||||
|
@@ -83,8 +83,9 @@ static int fp_init(u32 hartid)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int delegate_traps(u32 hartid)
|
static int delegate_traps(struct sbi_scratch *scratch, u32 hartid)
|
||||||
{
|
{
|
||||||
|
struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
||||||
unsigned long interrupts, exceptions;
|
unsigned long interrupts, exceptions;
|
||||||
|
|
||||||
if (!misa_extension('S')) {
|
if (!misa_extension('S')) {
|
||||||
@@ -95,11 +96,12 @@ static int delegate_traps(u32 hartid)
|
|||||||
/* Send M-mode interrupts and most exceptions to S-mode */
|
/* Send M-mode interrupts and most exceptions to S-mode */
|
||||||
interrupts = MIP_SSIP | MIP_STIP | MIP_SEIP;
|
interrupts = MIP_SSIP | MIP_STIP | MIP_SEIP;
|
||||||
exceptions = (1U << CAUSE_MISALIGNED_FETCH) |
|
exceptions = (1U << CAUSE_MISALIGNED_FETCH) |
|
||||||
(1U << CAUSE_FETCH_PAGE_FAULT) |
|
|
||||||
(1U << CAUSE_BREAKPOINT) |
|
(1U << CAUSE_BREAKPOINT) |
|
||||||
(1U << CAUSE_LOAD_PAGE_FAULT) |
|
|
||||||
(1U << CAUSE_STORE_PAGE_FAULT) |
|
|
||||||
(1U << CAUSE_USER_ECALL);
|
(1U << CAUSE_USER_ECALL);
|
||||||
|
if (sbi_platform_has_mfaults_delegation(plat))
|
||||||
|
exceptions |= (1U << CAUSE_FETCH_PAGE_FAULT) |
|
||||||
|
(1U << CAUSE_LOAD_PAGE_FAULT) |
|
||||||
|
(1U << CAUSE_STORE_PAGE_FAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
csr_write(mideleg, interrupts);
|
csr_write(mideleg, interrupts);
|
||||||
@@ -200,7 +202,7 @@ int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = delegate_traps(hartid);
|
rc = delegate_traps(scratch, hartid);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
@@ -105,7 +105,7 @@ static int sifive_u_system_down(u32 type)
|
|||||||
|
|
||||||
struct sbi_platform platform = {
|
struct sbi_platform platform = {
|
||||||
.name = STRINGIFY(PLAT_NAME),
|
.name = STRINGIFY(PLAT_NAME),
|
||||||
.features = SBI_PLATFORM_DEFAULT_FEATURES;
|
.features = SBI_PLATFORM_DEFAULT_FEATURES,
|
||||||
.hart_count = PLAT_HART_COUNT,
|
.hart_count = PLAT_HART_COUNT,
|
||||||
.hart_stack_size = PLAT_HART_STACK_SIZE,
|
.hart_stack_size = PLAT_HART_STACK_SIZE,
|
||||||
.pmp_region_count = sifive_u_pmp_region_count,
|
.pmp_region_count = sifive_u_pmp_region_count,
|
||||||
|
Reference in New Issue
Block a user