X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fmmap.c;h=f4132d5581cc8b62e67d5e1ea42b8884df39aa41;hb=e7dd0e094f0c23bb20ddb0025f41d1c0c28f5ab2;hp=b33350a575ecfa6ffa823afec165db34c68c9ff3;hpb=94583280d213ba9bf25fc1b2e4d1a227b2ea308d;p=tpg%2Facess2.git diff --git a/Kernel/vfs/mmap.c b/Kernel/vfs/mmap.c index b33350a5..f4132d55 100644 --- a/Kernel/vfs/mmap.c +++ b/Kernel/vfs/mmap.c @@ -1,8 +1,11 @@ /* - * Acess2 VFS - * - Open, Close and ChDir + * Acess2 Kernel VFS + * - By John Hodge (thePowersGang) + * + * mmap.c + * - VFS_MMap support */ -#define DEBUG 1 +#define DEBUG 0 #include #include #include @@ -29,6 +32,9 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, ENTER("pDestHint iLength xProtection xFlags xFD XOffset", DestHint, Length, Protection, Flags, FD, Offset); + if( Flags & MMAP_MAP_ANONYMOUS ) + Offset = (tVAddr)DestHint & 0xFFF; + npages = ((Offset & (PAGE_SIZE-1)) + Length + (PAGE_SIZE - 1)) / PAGE_SIZE; pagenum = Offset / PAGE_SIZE; @@ -41,14 +47,19 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, if( Flags & MMAP_MAP_ANONYMOUS ) { 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 @@ -130,6 +141,7 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, else { MM_Map( mapping_dest, pb->PhysAddrs[pagenum - pb->BaseOffset] ); + MM_RefPhys( pb->PhysAddrs[pagenum - pb->BaseOffset] ); LOG("Cached map %X to %p (%P)", pagenum*PAGE_SIZE, mapping_dest, pb->PhysAddrs[pagenum - pb->BaseOffset]); } @@ -142,6 +154,13 @@ void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, else { MM_SetFlags(mapping_dest, 0, MM_PFLAG_RO); } + + if( Protection & MMAP_PROT_EXEC ) { + MM_SetFlags(mapping_dest, MM_PFLAG_EXEC, MM_PFLAG_EXEC); + } + else { + MM_SetFlags(mapping_dest, 0, MM_PFLAG_EXEC); + } } else {