+
+ 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;