#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>
void create(Object *obj)
{
- *obj = static_cast<IAddrSpace>(*(new AddrSpace(false)));
+ *obj = static_cast<IAddrSpace>(*(new AddrSpace));
}
};
void create(Object *obj)
{
- AddrSpace *as = new AddrSpace(true);
+ AddrSpace *as = new ProcAddrSpace;
Region region;
MapFlags mf = 0;
u64 vstart;
printf("vstart %llx\n", vstart);
as->map(anonmem, region, &vstart, mf);
- *obj = static_cast<IAddrSpace>(*(as));
+ *obj = static_cast<IAddrSpace>(*as);
}
};
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)
{
*min_align = Arch::page_mapping_min_align;
}
+
+ void AddrSpace::get_size(u64 *size)
+ {
+ page_table->get_size(size);
+ }
void Mappable::map(VirtualArea *varea)
{
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)
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)