Re: [PATCH 1/2] ARM: mmu: inherit pte flags from pmd

2021-06-20 Thread Sascha Hauer
On Fri, Jun 18, 2021 at 10:09:38AM +0200, Steffen Trumtrar wrote:
> From: Sascha Hauer 
> 
> When creating a 2nd level page table from a section inherit the flags
> from the section rather than assuming the section was mapped cached
> previously. This fixes creating a 2nd level pagetable when the section
> was mapped differently than we expected.
> 
> Signed-off-by: Sascha Hauer 
> ---
>  arch/arm/cpu/mmu.c | 28 
>  1 file changed, 24 insertions(+), 4 deletions(-)

Applied this one only for now, thanks

Sascha

-- 
Pengutronix e.K.   | |
Steuerwalder Str. 21   | http://www.pengutronix.de/  |
31137 Hildesheim, Germany  | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 1/2] ARM: mmu: inherit pte flags from pmd

2021-06-18 Thread Steffen Trumtrar
From: Sascha Hauer 

When creating a 2nd level page table from a section inherit the flags
from the section rather than assuming the section was mapped cached
previously. This fixes creating a 2nd level pagetable when the section
was mapped differently than we expected.

Signed-off-by: Sascha Hauer 
---
 arch/arm/cpu/mmu.c | 28 
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/arch/arm/cpu/mmu.c b/arch/arm/cpu/mmu.c
index 6af228505dd1..6388e1bf14f6 100644
--- a/arch/arm/cpu/mmu.c
+++ b/arch/arm/cpu/mmu.c
@@ -138,6 +138,29 @@ static u32 *arm_create_pte(unsigned long virt, uint32_t 
flags)
return table;
 }
 
+static u32 pmd_flags_to_pte(u32 pmd)
+{
+   u32 pte = 0;
+
+   if (pmd & PMD_SECT_BUFFERABLE)
+   pte |= PTE_BUFFERABLE;
+   if (pmd & PMD_SECT_CACHEABLE)
+   pte |= PTE_CACHEABLE;
+   if (pmd & PMD_SECT_nG)
+   pte |= PTE_EXT_NG;
+   if (pmd & PMD_SECT_XN)
+   pte |= PTE_EXT_XN;
+
+   /* TEX[2:0] */
+   pte |= PTE_EXT_TEX((pmd >> 12) & 7);
+   /* AP[1:0] */
+   pte |= ((pmd >> 10) & 0x3) << 4;
+   /* AP[2] */
+   pte |= ((pmd >> 15) & 0x1) << 9;
+
+   return pte;
+}
+
 int arch_remap_range(void *start, size_t size, unsigned flags)
 {
u32 addr = (u32)start;
@@ -206,11 +229,8 @@ int arch_remap_range(void *start, size_t size, unsigned 
flags)
 * If PTE is not found it means that
 * we needs to split this section and
 * create a new page table for it
-*
-* NOTE: Here we assume that section
-* we just split was mapped as cached
 */
-   table = arm_create_pte(addr, pte_flags_cached);
+   table = arm_create_pte(addr, 
pmd_flags_to_pte(*pgd));
pte = find_pte(addr);
BUG_ON(!pte);
}
-- 
2.29.2


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox