X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=kernel%2Fmem%2Faddrspace.cc;h=b9bd07af82f54c2c92e483fbda899aa7eb58d83f;hp=324421f7f2b1f7fd1be271fb7f6c210c662cdb29;hb=223354cf6f772fe854996a22e776b3fa83490f44;hpb=b60e27a3186098774f15e08972ed4671298569fd diff --git a/kernel/mem/addrspace.cc b/kernel/mem/addrspace.cc index 324421f..b9bd07a 100644 --- a/kernel/mem/addrspace.cc +++ b/kernel/mem/addrspace.cc @@ -499,9 +499,9 @@ namespace Mem { new_page->release(); } - void ASpaceMappable::get_entry(u64 vaddr, u64 *phys, PTEFlags *flags) + void ASpaceMappable::get_mapping(u64 vaddr, u64 *phys, PTEFlags *flags) { - aspace->page_table->get_entry(vaddr, phys, flags); + aspace->page_table->get_mapping(vaddr, phys, flags); } bool AddrSpace::map(VirtualArea *va, u64 vaddr, PTEFlags reqflags) @@ -511,7 +511,7 @@ namespace Mem { u64 phys; PTEFlags flags; - va->ma->get_entry(vaddr + va->offset, &phys, &flags); + va->ma->get_mapping(vaddr + va->offset, &phys, &flags); PTEFlags newflags = flags & va->flags; newflags.FaultOnWrite = flags.FaultOnWrite | va->flags.FaultOnWrite; @@ -526,7 +526,7 @@ namespace Mem { u64 oldphys; PTEFlags oldflags; - page_table->get_entry(vaddr, &oldphys, &oldflags); + page_table->get_mapping(vaddr, &oldphys, &oldflags); if (oldflags.Valid && !(reqflags.Writeable && oldflags.FaultOnWrite)) @@ -826,7 +826,7 @@ namespace Mem { // once high memory support is added. } - void get_entry(u64 addr, u64 *phys, PTEFlags *flags) + void get_mapping(u64 addr, u64 *phys, PTEFlags *flags) { *phys = addr; *flags = 0; @@ -840,6 +840,45 @@ namespace Mem { PhysMem real_physmem; IMappable physmem = real_physmem; + + class AnonMem : public Mappable { + public: + void get_size(u64 *size) + { + if (sizeof(long) == 8) + *size = 1ULL << (64 - Arch::page_shift); + else + *size = 1ULL << (32 - Arch::page_shift); + } + + 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) + { + Page *page = PageAlloc::alloc(1); + + // OPT: Only zero if it was asked for. + // OPT: Eventually, have separate pagelists for zeroed and + // unzeroed memory, and a low-priority background thread + // that zeroes pages and moves them to the zeroed list. + bzero(page_to_kvirt(page), Arch::page_size); + + *phys = page_to_phys(page); + *flags = 0; + flags->Valid = 1; + flags->Readable = 1; + flags->Writeable = 1; + flags->Executable = 1; + flags->User = 1; + } + }; + + AnonMem real_anonmem; + IMappable anonmem = real_anonmem; } #include