aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSamuel Holland <samuel.holland@sifive.com>2025-11-21 11:37:52 -0800
committerAnup Patel <anup@brainfault.org>2025-12-08 16:47:55 +0530
commit51fe6a8bc958166ff79805cf69bafe5e297776f4 (patch)
treec1b36f55193e2b8f2642484104fd1a32220659b0 /lib
parent1f9677582af552bfaaf87579bb28b864d4b4130f (diff)
downloadopensbi-master.zip
opensbi-master.tar.gz
opensbi-master.tar.bz2
lib: utils: Use SBI_DOMAIN_MMIO to check MMIO device permissionsHEADmaster
Drivers or platforms may create memory regions with the MMIO flag set that contain S-mode-accessible MMIO devices. This is strictly correct and should be allowed, along with the existing default case of S-mode-accessible MMIO devices appearing in non-MMIO memory regions. When passed SBI_DOMAIN_MMIO, sbi_domain_check_addr() will perform the correct set of permission checks. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Yu-Chien Peter Lin <peter.lin@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20251121193808.1528050-3-samuel.holland@sifive.com Signed-off-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/utils/fdt/fdt_fixup.c2
-rw-r--r--lib/utils/mpxy/fdt_mpxy_rpmi_sysmsi.c3
2 files changed, 3 insertions, 2 deletions
diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
index f3fe8af..b0ed20c 100644
--- a/lib/utils/fdt/fdt_fixup.c
+++ b/lib/utils/fdt/fdt_fixup.c
@@ -185,7 +185,7 @@ static void fdt_domain_based_fixup_one(void *fdt, int nodeoff)
return;
if (!sbi_domain_check_addr(dom, reg_addr, dom->next_mode,
- SBI_DOMAIN_READ | SBI_DOMAIN_WRITE)) {
+ SBI_DOMAIN_READ | SBI_DOMAIN_WRITE | SBI_DOMAIN_MMIO)) {
rc = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 32);
if (rc < 0)
return;
diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_sysmsi.c b/lib/utils/mpxy/fdt_mpxy_rpmi_sysmsi.c
index 94a5af8..1dcc049 100644
--- a/lib/utils/mpxy/fdt_mpxy_rpmi_sysmsi.c
+++ b/lib/utils/mpxy/fdt_mpxy_rpmi_sysmsi.c
@@ -57,7 +57,8 @@ static int mpxy_rpmi_sysmis_xfer(void *context, struct mbox_chan *chan,
sys_msi_address |= ((u64)le32_to_cpu(((u32 *)xfer->tx)[2])) << 32;
if (!sbi_domain_check_addr_range(sbi_domain_thishart_ptr(),
sys_msi_address, 0x4, PRV_S,
- SBI_DOMAIN_READ | SBI_DOMAIN_WRITE)) {
+ SBI_DOMAIN_READ | SBI_DOMAIN_WRITE |
+ SBI_DOMAIN_MMIO)) {
((u32 *)xfer->rx)[0] = cpu_to_le32(RPMI_ERR_INVALID_ADDR);
args->rx_data_len = sizeof(u32);
break;