lib: sbi: Use finer permission sematics to decide on PMP bits
authorHimanshu Chauhan <hchauhan@ventanamicro.com>
Mon, 9 Jan 2023 05:20:38 +0000 (05:20 +0000)
committerAnup Patel <anup@brainfault.org>
Mon, 9 Jan 2023 12:34:17 +0000 (18:04 +0530)
Use the fine grained permission bits to decide if the region
permissions are to be enforced on all modes. Also use the new
permission bits for deciding on R/W/X bits in pmpcfg register.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
lib/sbi/sbi_hart.c

index 5447c52..02ce991 100644 (file)
@@ -303,14 +303,20 @@ int sbi_hart_pmp_configure(struct sbi_scratch *scratch)
                        break;
 
                pmp_flags = 0;
-               if (reg->flags & SBI_DOMAIN_MEMREGION_READABLE)
+
+               /*
+                * 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_WRITEABLE)
+               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE)
                        pmp_flags |= PMP_W;
-               if (reg->flags & SBI_DOMAIN_MEMREGION_EXECUTABLE)
+               if (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE)
                        pmp_flags |= PMP_X;
-               if (reg->flags & SBI_DOMAIN_MEMREGION_MMODE)
-                       pmp_flags |= PMP_L;
 
                pmp_addr =  reg->base >> PMP_SHIFT;
                if (pmp_gran_log2 <= reg->order && pmp_addr < pmp_addr_max)