]> git.buserror.net Git - polintos/scott/priv.git/blobdiff - kernel/mem/addrspace.cc
Lots of stuff.
[polintos/scott/priv.git] / kernel / mem / addrspace.cc
index 6cff1f2d602635c1b8fbb145153baddb999d5539..20a46fb04d09c6997e87ee2669e94cabefb494b6 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <kern/mem.h>
 #include <kern/paging.h>
+#include <kern/generic-pagetable.h>
 #include <kern/pagetable.h>
 #include <kern/pagealloc.h>
 #include <kern/generic-pte.h>
@@ -43,7 +44,7 @@ namespace Mem {
                
                void create(Object *obj)
                {
-                       *obj = static_cast<IAddrSpace>(*(new AddrSpace(false)));
+                       *obj = static_cast<IAddrSpace>(*(new AddrSpace));
                }
        };
 
@@ -58,7 +59,7 @@ namespace Mem {
                
                void create(Object *obj)
                {
-                       AddrSpace *as = new AddrSpace(true);
+                       AddrSpace *as = new ProcAddrSpace;
                        Region region;
                        MapFlags mf = 0;
                        u64 vstart;
@@ -88,7 +89,7 @@ namespace Mem {
                        printf("vstart %llx\n", vstart);
                        as->map(anonmem, region, &vstart, mf);
                        
-                       *obj = static_cast<IAddrSpace>(*(as));
+                       *obj = static_cast<IAddrSpace>(*as);
                }
        };
        
@@ -98,34 +99,32 @@ namespace Mem {
        AddrSpaceFactory real_addrspace_factory;
        Factory addr_space_factory = real_addrspace_factory;
 
-       AddrSpace::AddrSpace(bool process) : mappable(this)
+       AddrSpace::AddrSpace(PageTable *ptbl) : mappable(this)
        {
                init_iface();
-               is_process = process;
+               is_process = false;
+               page_table = ptbl;
                
-               // OPT: Allow optional use of the native PTE for stacked aspaces,
-               // either because the native PTE is 64-bit, or because it's an
-               // embedded system which does not need 64-bit storage.
-               
-               if (process)
-                       page_table = new PageTableImpl<Arch::PTE>(true);
-               else
+               if (!ptbl)
                        page_table = new PageTableImpl<GenPTE>(false);
                
                cached_free_region = Arch::user_start + Arch::page_size;
        }
        
+       ProcAddrSpace::ProcAddrSpace() :
+       AddrSpace(new PageTableImpl<Arch::PTE>(true))
+       {
+               is_process = true;
+       }
+       
        // This should only be used once during bootup to initialize the
        // kernel's address space with a static initial page table.
        
-       AddrSpace::AddrSpace(void *ptbl_toplevel) : mappable(this)
+       ProcAddrSpace::ProcAddrSpace(void *ptbl_toplevel) :
+       AddrSpace(new PageTableImpl<Arch::PTE>(ptbl_toplevel))
        {
-               init_iface();
+               // FIXME: set cached_free_region to kernel virtual space
                is_process = true;
-               page_table = new PageTableImpl<Arch::PTE>(ptbl_toplevel);
-               
-               // FIXME: should be kernel virtual space
-               cached_free_region = Arch::user_start + Arch::page_size;
        }
 
        void AddrSpace::get_mappable(IMappable *ma)
@@ -749,6 +748,11 @@ namespace Mem {
        {
                *min_align = Arch::page_mapping_min_align;
        }
+
+       void AddrSpace::get_size(u64 *size)
+       {
+               page_table->get_size(size);
+       }
        
        void Mappable::map(VirtualArea *varea)
        {
@@ -802,8 +806,6 @@ namespace Mem {
        
                void pagein(u64 vaddr, PTEFlags reqflags)
                {
-                       // Doesn't need to do anything yet, though it may later
-                       // once high memory support is added.
                }
                
                void get_mapping(u64 addr, u64 *phys, PTEFlags *flags)
@@ -833,8 +835,6 @@ namespace Mem {
        
                void pagein(u64 vaddr, PTEFlags reqflags)
                {
-                       // Doesn't need to do anything yet, though it may later
-                       // once high memory support is added.
                }
                
                void get_mapping(u64 addr, u64 *phys, PTEFlags *flags)