+ size_t ofs = 0;
+ LOG("%i pages anonymous to %p", npages, mapping_dest);
+ for( ; npages --; mapping_dest += PAGE_SIZE, ofs += PAGE_SIZE )
+ {
+ if( MM_GetPhysAddr(mapping_dest) ) {
+ // TODO: Set flags to COW if needed (well, if shared)
+ MM_SetFlags(mapping_dest, MM_PFLAG_COW, MM_PFLAG_COW);
+ LOG("clear from %p, %i bytes", (void*)(mapping_base + ofs),
+ PAGE_SIZE - (mapping_base & (PAGE_SIZE-1))
+ );
+ memset( (void*)(mapping_base + ofs), 0, PAGE_SIZE - (mapping_base & (PAGE_SIZE-1)));
+ }
+ else {
+ LOG("New empty page");
+ // TODO: Map a COW zero page instead
+ if( !MM_Allocate(mapping_dest) ) {
+ // TODO: Error
+ Log_Warning("VFS", "VFS_MMap: Anon alloc to %p failed", mapping_dest);
+ }
+ memset((void*)mapping_dest, 0, PAGE_SIZE);
+ LOG("Anon map to %p", mapping_dest);
+ }
+ }
+ LEAVE_RET('p', (void*)mapping_base);