X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fmmap.c;h=cbfce43b019d6179c361aceda029758699c22777;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=612886957c98019069b64098324017b567ec33b1;hpb=2fcb3775f3afee7bfa9aa3cbb6aea3c6c3426e64;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/mmap.c b/KernelLand/Kernel/vfs/mmap.c index 61288695..cbfce43b 100644 --- a/KernelLand/Kernel/vfs/mmap.c +++ b/KernelLand/Kernel/vfs/mmap.c @@ -50,13 +50,14 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, LOG("%i pages anonymous to %p", npages, mapping_dest); for( ; npages --; mapping_dest += PAGE_SIZE, ofs += PAGE_SIZE ) { - if( MM_GetPhysAddr(mapping_dest) ) { + if( MM_GetPhysAddr((void*)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))); + LOG("dune"); } else { LOG("New empty page"); @@ -85,7 +86,8 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, pb = h->Node->MMapInfo, prev = NULL; pb && pb->BaseOffset + MMAP_PAGES_PER_BLOCK < pagenum; prev = pb, pb = pb->Next - ); + ) + ; LOG("pb = %p, pb->BaseOffset = %X", pb, pb ? pb->BaseOffset : 0); @@ -109,7 +111,7 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, // - Map (and allocate) pages while( npages -- ) { - if( MM_GetPhysAddr(mapping_dest) == 0 ) + if( MM_GetPhysAddr( (void*)mapping_dest ) == 0 ) { if( pb->PhysAddrs[pagenum - pb->BaseOffset] == 0 ) { @@ -131,12 +133,14 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, return NULL; } // TODO: Clip read length - read_len = nt->Read(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, (void*)mapping_dest); -// if( read_len != PAGE_SIZE ) { -// memset( (void*)(mapping_dest+read_len), 0, PAGE_SIZE-read_len ); -// } + read_len = nt->Read(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, + (void*)mapping_dest, 0); + // TODO: This was commented out, why? + if( read_len != PAGE_SIZE ) { + memset( (void*)(mapping_dest+read_len), 0, PAGE_SIZE-read_len ); + } } - pb->PhysAddrs[pagenum - pb->BaseOffset] = MM_GetPhysAddr( mapping_dest ); + pb->PhysAddrs[pagenum - pb->BaseOffset] = MM_GetPhysAddr( (void*)mapping_dest ); MM_SetPageNode( pb->PhysAddrs[pagenum - pb->BaseOffset], h->Node ); MM_RefPhys( pb->PhysAddrs[pagenum - pb->BaseOffset] ); LOG("Read and map %X to %p (%P)", pagenum*PAGE_SIZE, mapping_dest,