]> Zhao Yanbai Git Server - minix.git/commitdiff
arm:vm allow per memory type flags. 51/851/2
authorKees Jongenburger <kees.jongenburger@gmail.com>
Wed, 25 Sep 2013 08:41:26 +0000 (10:41 +0200)
committerKees Jongenburger <kees.jongenburger@gmail.com>
Thu, 26 Sep 2013 10:11:28 +0000 (12:11 +0200)
Change-Id: Id5a5bd479bdfbbc3fb52a85c29e1d7712a1171a7

servers/vm/mem_anon.c
servers/vm/mem_anon_contig.c
servers/vm/mem_cache.c
servers/vm/mem_directphys.c
servers/vm/mem_file.c
servers/vm/mem_shared.c
servers/vm/memtype.h
servers/vm/region.c

index 5158f882df9485ec2454405c7210bf7ee65d16cb..68a7813e9da1071a7a1ebb857fd498caad362e7a 100644 (file)
@@ -29,6 +29,7 @@ static int anon_writable(struct phys_region *pr);
 static int anon_resize(struct vmproc *vmp, struct vir_region *vr, vir_bytes l);
 static u32_t anon_regionid(struct vir_region *region);
 static int anon_refcount(struct vir_region *vr);
+static int anon_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_anon = {
        .name = "anonymous memory",
@@ -40,9 +41,18 @@ struct mem_type mem_type_anon = {
        .ev_split = anon_split,
        .regionid = anon_regionid,
        .writable = anon_writable,
-       .refcount = anon_refcount
+       .refcount = anon_refcount,
+       .pt_flags = anon_pt_flags,
 };
 
+static int anon_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return ARM_VM_PTE_CACHED;
+#else
+       return 0;
+#endif
+}
+
 static int anon_unreference(struct phys_region *pr)
 {
        assert(pr->ph->refcount == 0);
index ee6e8ea1a1cc68cac26f111eb3afc4b5d9cc35dc..4b09ec52f1f67cbb2d4e7064dc8696d740c7493f 100644 (file)
@@ -17,6 +17,7 @@ static int anon_contig_sanitycheck(struct phys_region *pr, char *file, int line)
 static int anon_contig_writable(struct phys_region *pr);
 static int anon_contig_resize(struct vmproc *vmp, struct vir_region *vr, vir_bytes l);
 static int anon_contig_new(struct vir_region *vr);
+static int anon_contig_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_anon_contig = {
        .name = "anonymous memory (physically contiguous)",
@@ -26,9 +27,18 @@ struct mem_type mem_type_anon_contig = {
        .ev_pagefault = anon_contig_pagefault,
        .ev_resize = anon_contig_resize,
        .ev_sanitycheck = anon_contig_sanitycheck,
-       .writable = anon_contig_writable
+       .writable = anon_contig_writable,
+       .pt_flags = anon_contig_pt_flags,
 };
 
+static int anon_contig_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return  ARM_VM_PTE_DEVICE;
+#else
+       return  0;
+#endif
+}
+
 static int anon_contig_pagefault(struct vmproc *vmp, struct vir_region *region,
        struct phys_region *ph, int write, vfs_callback_t cb, void *state,
        int len, int *io)
index 646008eb0775f971d8f8f9fa17882f7b275b1745..674efe4c732daeffd671744e979930e2d43c15d1 100644 (file)
@@ -31,6 +31,7 @@ static int cache_resize(struct vmproc *vmp, struct vir_region *vr, vir_bytes l);
 static int cache_pagefault(struct vmproc *vmp, struct vir_region *region, 
         struct phys_region *ph, int write, vfs_callback_t cb, void *state,
        int len, int *io);
+static int cache_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_cache = {
        .name = "cache memory",
@@ -40,8 +41,18 @@ struct mem_type mem_type_cache = {
        .ev_sanitycheck = cache_sanitycheck,
        .ev_pagefault = cache_pagefault,
        .writable = cache_writable,
+       .pt_flags = cache_pt_flags,
 };
 
+static int cache_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return ARM_VM_PTE_CACHED;
+#else
+       return 0;
+#endif
+}
+
+
 static int cache_reference(struct phys_region *pr, struct phys_region *pr2)
 {
        return OK;
index 542765761cc7af18bdfa458d96c5bd73c2f5cd31..ea4ceb87b1dec8d515c7845f7aaa5ae949a3dc93 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "vm.h"
 #include "proto.h"
+#include "region.h"
+#include "glo.h"
 
 /* These functions are static so as to not pollute the
  * global namespace, and are accessed through their function
@@ -21,15 +23,25 @@ static int phys_pagefault(struct vmproc *vmp, struct vir_region *region,
         struct phys_region *ph, int write, vfs_callback_t cb, void *state,
        int len, int *io);
 static int phys_copy(struct vir_region *vr, struct vir_region *newvr);
+static int phys_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_directphys = {
        .name = "physical memory mapping",
        .ev_copy = phys_copy,
        .ev_unreference = phys_unreference,
        .writable = phys_writable,
-       .ev_pagefault = phys_pagefault
+       .ev_pagefault = phys_pagefault,
+       .pt_flags = phys_pt_flags
 };
 
+static int phys_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return ARM_VM_PTE_DEVICE;
+#else
+       return 0;
+#endif
+}
+
 static int phys_unreference(struct phys_region *pr)
 {
        return OK;
index 9fc51140da1af3b9f69253adcfc4ef9e9e37512f..023e0f968efad31cd7e635a6007995bfaf57d478 100644 (file)
@@ -25,6 +25,7 @@ static int mappedfile_writable(struct phys_region *pr);
 static int mappedfile_copy(struct vir_region *vr, struct vir_region *newvr);
 static int mappedfile_lowshrink(struct vir_region *vr, vir_bytes len);
 static void mappedfile_delete(struct vir_region *region);
+static int mappedfile_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_mappedfile = {
        .name = "file-mapped memory",
@@ -36,8 +37,17 @@ struct mem_type mem_type_mappedfile = {
        .ev_split = mappedfile_split,
        .ev_lowshrink = mappedfile_lowshrink,
        .ev_delete = mappedfile_delete,
+       .pt_flags = mappedfile_pt_flags,
 };
 
+static int mappedfile_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return ARM_VM_PTE_CACHED;
+#else
+       return 0;
+#endif
+}
+
 static int mappedfile_unreference(struct phys_region *pr)
 {
        assert(pr->ph->refcount == 0);
index 7a0f95fc12cfbb5a4c2ba4f7af2acaf235534bd7..19239b09fb71a1074f8ba057675630e8ffc6402e 100644 (file)
@@ -23,6 +23,7 @@ static void shared_delete(struct vir_region *region);
 static u32_t shared_regionid(struct vir_region *region);
 static int shared_copy(struct vir_region *vr, struct vir_region *newvr);
 static int shared_refcount(struct vir_region *vr);
+static int shared_pt_flags(struct vir_region *vr);
 
 struct mem_type mem_type_shared = {
        .name = "shared memory",
@@ -33,9 +34,18 @@ struct mem_type mem_type_shared = {
        .ev_delete = shared_delete,
        .regionid = shared_regionid,
        .refcount = shared_refcount,
-       .writable = shared_writable
+       .writable = shared_writable,
+       .pt_flags = shared_pt_flags,
 };
 
+static int shared_pt_flags(struct vir_region *vr){
+#if defined(__arm__)
+       return ARM_VM_PTE_CACHED;
+#else
+       return 0;
+#endif
+}
+
 static int shared_unreference(struct phys_region *pr)
 {
        return mem_type_anon.ev_unreference(pr);
index 3574dd3632a71c7a3ab6ed7566fef168f3604cda..a8c14dce9bc248d882bbd71d440abf3f305efaf2 100644 (file)
@@ -27,6 +27,7 @@ typedef struct mem_type {
         int (*ev_lowshrink)(struct vir_region *vr, vir_bytes len);
        u32_t (*regionid)(struct vir_region *vr);
         int (*refcount)(struct vir_region *vr);
+        int (*pt_flags)(struct vir_region *vr); /* page table flags */
 } mem_type_t;
 
 #endif
index 7928d2538227ec42d58a944ec83184732f357a5e..9728bdd1c6a34e0587850690e92f66eba499e7f8 100644 (file)
@@ -273,13 +273,9 @@ int map_ph_writept(struct vmproc *vmp, struct vir_region *vr,
        else
                flags |= PTF_READ;
 
-#if  defined(__arm__)
-       if (pb->phys >= 0x80000000 && pb->phys < (0xc0000000 - VM_PAGE_SIZE)) {
-               // LSC Do this only for actual RAM
-               // KEJO:fishy will need to look into this 
-               flags |= ARM_VM_PTE_DEVICE;
-       }
-#endif
+
+       if(vr->def_memtype->pt_flags)
+               flags |= vr->def_memtype->pt_flags(vr);
 
        if(pt_writemap(vmp, &vmp->vm_pt, vr->vaddr + pr->offset,
                        pb->phys, VM_PAGE_SIZE, flags,