]> Zhao Yanbai Git Server - minix.git/commitdiff
arm:make the MMU fetch pagetable data through the caches. 47/847/2
authorKees Jongenburger <kees.jongenburger@gmail.com>
Wed, 25 Sep 2013 09:12:46 +0000 (11:12 +0200)
committerKees Jongenburger <kees.jongenburger@gmail.com>
Thu, 26 Sep 2013 09:54:36 +0000 (11:54 +0200)
Change-Id: Ibd7b66558c369d0c0792c02801562580d255fa1f

include/arch/earm/include/vm.h
kernel/arch/earm/include/cpufunc.h
kernel/arch/earm/memory.c

index 98c155fc48a50e56444afbee3feecfff696a9453..0d7cec642eac76a4ba3de493d21d090cd3747b90 100644 (file)
@@ -163,6 +163,21 @@ arm/vm.h
 #define ARM_VM_PFE_FS4    (1<<10)  /* Fault status (bit 4) */
 #define ARM_VM_PFE_FS3_0   0xf     /* Fault status (bits 3:0) */
 
+
+/* Translation table base register specfic flags */
+#define ARM_TTBR_C (0x01) /* Cacheable bit. Indicates whether the translation table walk is to Inner Cacheable memory. */
+
+/* RGN bits[4:3] indicates the Outer cacheability attributes 
+   for the memory associated with the translation table walks */
+#define ARM_TTBR_OUTER_NC    (0x0 << 3) /* Non-cacheable*/
+#define ARM_TTBR_OUTER_WBWA  (0x1 << 3) /* Outer Write-Back Write-Allocate Cacheable. */
+#define ARM_TTBR_OUTER_WT    (0x2 << 3) /* Outer Write-Through Cacheable. */
+#define ARM_TTBR_OUTER_WBNWA (0x3 << 3) /* Outer Write-Back no Write-Allocate Cacheable. */
+
+
+#define ARM_TTBR_ADDR_MASK (0xffffc000) /* only the 18 upper bits are to be used as address */
+#define ARM_TTBR_FLAGS_CACHED ARM_TTBR_OUTER_WBWA
+
 /* Fault status */
 #define ARM_VM_PFE_FS(s) \
     ((((s) & ARM_VM_PFE_FS4) >> 6) | ((s) & ARM_VM_PFE_FS3_0))
index d44f505b3576beac90d6b601c2c045b21dc99bf0..c5606dbe4d06ada8578dd868948c8d5e9e37a8e1 100644 (file)
@@ -215,16 +215,20 @@ static inline u32_t read_ttbr0()
        asm volatile("mrc p15, 0, %[bar], c2, c0, 0 @ Read TTBR0\n\t"
                        : [bar] "=r" (bar));
 
-       return bar;
+       return bar & ARM_TTBR_ADDR_MASK;
 }
 
 /* Write Translation Table Base Register 0 */
 static inline void write_ttbr0(u32_t bar)
 {
        barrier();
-
+       /* In our setup TTBR contains the base address *and* the flags
+          but other pieces of the kernel code expect ttbr to be the 
+          base address of the l1 page table. We therefore add the
+          flags here and remove them in the read_ttbr0 */
+       u32_t v  =  (bar  & ARM_TTBR_ADDR_MASK ) | ARM_TTBR_FLAGS_CACHED;
        asm volatile("mcr p15, 0, %[bar], c2, c0, 0 @ Write TTBR0\n\t"
-                       : : [bar] "r" (bar));
+                       : : [bar] "r" (v));
 
        refresh_tlb();
 }
index ad61ace3850474020f52394ef016c0de30af2baa..fa6fb13446e7012e53874ba40870118b43afb65b 100644 (file)
@@ -303,7 +303,7 @@ int vm_lookup(const struct proc *proc, const vir_bytes virtual,
        assert(HASPT(proc));
 
        /* Retrieve page directory entry. */
-       root = (u32_t *) proc->p_seg.p_ttbr;
+       root = (u32_t *) (proc->p_seg.p_ttbr & ARM_TTBR_ADDR_MASK);
        assert(!((u32_t) root % ARM_PAGEDIR_SIZE));
        pde = ARM_VM_PDE(virtual);
        assert(pde >= 0 && pde < ARM_VM_DIR_ENTRIES);