Kernel - Fixes from clang's scan-build tool
[tpg/acess2.git] / Kernel / vfs / mmap.c
index f8422bb..7c3fdf4 100644 (file)
@@ -9,34 +9,38 @@
 #include <vfs_int.h>
 
 #define MMAP_PAGES_PER_BLOCK   16
+#define PAGE_SIZE      0x1000  // Should be in mm_virt.h
 
 // === STRUCTURES ===
-typedef struct sVFS_MMapPageBlock
+typedef struct sVFS_MMapPageBlock      tVFS_MMapPageBlock;
+struct sVFS_MMapPageBlock
 {
        tVFS_MMapPageBlock      *Next;
        Uint64  BaseOffset;     // Must be a multiple of MMAP_PAGES_PER_BLOCK*PAGE_SIZE
        tPAddr  PhysAddrs[MMAP_PAGES_PER_BLOCK];
-} tVFS_MMapPageBlock;
+};
 
 // === CODE ===
-void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Flags, int FD, Uint64 Offset)
+void *VFS_MMap(void *DestHint, size_t Length, int Protection, int Flags, int FD, Uint64 Offset)
 {
        tVFS_Handle     *h;
-       void    *mapping_dest;
+       tVAddr  mapping_dest;
         int    npages, pagenum;
        tVFS_MMapPageBlock      *pb, *prev;
        
        npages = ((Offset & (PAGE_SIZE-1)) + Length) / PAGE_SIZE;
        pagenum = Offset / PAGE_SIZE;
 
-       mapping_dest = DestHint;        
+       mapping_dest = (tVAddr)DestHint;        
 
+#if 0
        // TODO: Locate space for the allocation
        if( Flags & MAP_ANONYMOUS )
        {
                MM_Allocate(mapping_dest);
-               return mapping_dest;
+               return (void*)mapping_dest;
        }
+#endif
 
        h = VFS_GetHandle(FD);
        if( !h || !h->Node )    return NULL;
@@ -49,10 +53,10 @@ void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Fl
                prev = pb, pb = pb->Next
                );
 
+       // - Allocate a block if needed
        if( !pb || pb->BaseOffset > pagenum )
        {
                void    *old_pb = pb;
-               // Allocate if needed
                pb = malloc( sizeof(tVFS_MMapPageBlock) );
                if(!pb) return NULL;
                pb->Next = old_pb;
@@ -64,19 +68,24 @@ void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Fl
                        h->Node->MMapInfo = pb;
        }
 
+       // - Map (and allocate) pages
        while( npages -- )
        {
                if( pb->PhysAddrs[pagenum - pb->BaseOffset] == 0 )
                {
                        if( h->Node->MMap )
-                               h->Node->MMap(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, mapping_dest);
+                               h->Node->MMap(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, (void*)mapping_dest);
                        else
                        {
                                // Allocate pages and read data
-                               MM_Allocate(mapping_dest);
-                               h->Node->Read(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, mapping_dest);
+                               if( MM_Allocate(mapping_dest) == 0 ) {
+                                       // TODO: Unwrap
+                                       return NULL;
+                               }
+                               h->Node->Read(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, (void*)mapping_dest);
                        }
-                       pb->PhysAddrs[pagenum -> pb->BaseOffset] = MM_GetPhysAddr( mapping_dest );
+                       pb->PhysAddrs[pagenum - pb->BaseOffset] = MM_GetPhysAddr( mapping_dest );
+//                     MM_SetPageInfo( pb->PhysAddrs[pagenum - pb->BaseOffset], h->Node, pagenum*PAGE_SIZE );
                }
                else
                {
@@ -106,7 +115,7 @@ void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Fl
        return NULL;
 }
 
-int VFS_MUnmap(int *ErrNo, void *Addr, size_t Length)
+int VFS_MUnmap(void *Addr, size_t Length)
 {
        return 0;
 }

UCC git Repository :: git.ucc.asn.au