mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-12-22 06:12:02 +00:00
lib: sbi_domain: add sbi_domain_get_oldpmp_flags
Factor out logic in `sbi_hart_oldpmp_configure` into function `sbi_domain_get_oldpmp_flags`, analogous to `sbi_domain_get_smepmp_flags`. Platform specific hart-protection implementation can now leverage it. Signed-off-by: Bo Gan <ganboing@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20251218104243.562667-3-ganboing@gmail.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -253,6 +253,13 @@ void sbi_domain_memregion_init(unsigned long addr,
|
|||||||
unsigned long flags,
|
unsigned long flags,
|
||||||
struct sbi_domain_memregion *reg);
|
struct sbi_domain_memregion *reg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the oldpmp pmpcfg LRWX encoding for the flags in @reg.
|
||||||
|
*
|
||||||
|
* @param reg pointer to memory region; its flags field encodes permissions.
|
||||||
|
*/
|
||||||
|
unsigned int sbi_domain_get_oldpmp_flags(struct sbi_domain_memregion *reg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the Smepmp pmpcfg LRWX encoding for the flags in @reg.
|
* Return the Smepmp pmpcfg LRWX encoding for the flags in @reg.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -121,6 +121,28 @@ void sbi_domain_memregion_init(unsigned long addr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int sbi_domain_get_oldpmp_flags(struct sbi_domain_memregion *reg)
|
||||||
|
{
|
||||||
|
|
||||||
|
unsigned int pmp_flags = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If permissions are to be enforced for all modes on
|
||||||
|
* this region, the lock bit should be set.
|
||||||
|
*/
|
||||||
|
if (reg->flags & SBI_DOMAIN_MEMREGION_ENF_PERMISSIONS)
|
||||||
|
pmp_flags |= PMP_L;
|
||||||
|
|
||||||
|
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE)
|
||||||
|
pmp_flags |= PMP_R;
|
||||||
|
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE)
|
||||||
|
pmp_flags |= PMP_W;
|
||||||
|
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
|
||||||
|
pmp_flags |= PMP_X;
|
||||||
|
|
||||||
|
return pmp_flags;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int sbi_domain_get_smepmp_flags(struct sbi_domain_memregion *reg)
|
unsigned int sbi_domain_get_smepmp_flags(struct sbi_domain_memregion *reg)
|
||||||
{
|
{
|
||||||
unsigned int pmp_flags = 0;
|
unsigned int pmp_flags = 0;
|
||||||
|
|||||||
@@ -272,22 +272,7 @@ static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch)
|
|||||||
if (!is_valid_pmp_idx(pmp_count, pmp_idx))
|
if (!is_valid_pmp_idx(pmp_count, pmp_idx))
|
||||||
return SBI_EFAIL;
|
return SBI_EFAIL;
|
||||||
|
|
||||||
pmp_flags = 0;
|
pmp_flags = sbi_domain_get_oldpmp_flags(reg);
|
||||||
|
|
||||||
/*
|
|
||||||
* If permissions are to be enforced for all modes on
|
|
||||||
* this region, the lock bit should be set.
|
|
||||||
*/
|
|
||||||
if (reg->flags & SBI_DOMAIN_MEMREGION_ENF_PERMISSIONS)
|
|
||||||
pmp_flags |= PMP_L;
|
|
||||||
|
|
||||||
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE)
|
|
||||||
pmp_flags |= PMP_R;
|
|
||||||
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE)
|
|
||||||
pmp_flags |= PMP_W;
|
|
||||||
if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
|
|
||||||
pmp_flags |= PMP_X;
|
|
||||||
|
|
||||||
pmp_addr = reg->base >> PMP_SHIFT;
|
pmp_addr = reg->base >> PMP_SHIFT;
|
||||||
if (pmp_log2gran <= reg->order && pmp_addr < pmp_addr_max) {
|
if (pmp_log2gran <= reg->order && pmp_addr < pmp_addr_max) {
|
||||||
sbi_platform_pmp_set(sbi_platform_ptr(scratch),
|
sbi_platform_pmp_set(sbi_platform_ptr(scratch),
|
||||||
|
|||||||
Reference in New Issue
Block a user