3 * - Open, Close and ChDir
11 #define MMAP_PAGES_PER_BLOCK 16
14 typedef struct sVFS_MMapPageBlock
16 tVFS_MMapPageBlock *Next;
17 Uint64 BaseOffset; // Must be a multiple of MMAP_PAGES_PER_BLOCK*PAGE_SIZE
18 tPAddr PhysAddrs[MMAP_PAGES_PER_BLOCK];
22 void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Flags, int FD, Uint64 Offset)
27 tVFS_MMapPageBlock *pb, *prev;
29 npages = ((Offset & (PAGE_SIZE-1)) + Length) / PAGE_SIZE;
30 pagenum = Offset / PAGE_SIZE;
32 mapping_dest = DestHint;
34 // TODO: Locate space for the allocation
35 if( Flags & MAP_ANONYMOUS )
37 MM_Allocate(mapping_dest);
41 h = VFS_GetHandle(FD);
42 if( !h || !h->Node ) return NULL;
44 // Search for existing mapping for each page
45 // - Sorted list of 16 page blocks
47 pb = h->Node->MMapInfo, prev = NULL;
48 pb && pb->BaseOffset + MMAP_PAGES_PER_BLOCK < pagenum;
49 prev = pb, pb = pb->Next
52 if( !pb || pb->BaseOffset > pagenum )
56 pb = malloc( sizeof(tVFS_MMapPageBlock) );
59 pb->BaseOffset = pagenum - pagenum % MMAP_PAGES_PER_BLOCK;
60 memset(pb->PhysAddrs, 0, sizeof(pb->PhysAddrs));
64 h->Node->MMapInfo = pb;
69 if( pb->PhysAddrs[pagenum - pb->BaseOffset] == 0 )
72 h->Node->MMap(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, mapping_dest);
75 // Allocate pages and read data
76 MM_Allocate(mapping_dest);
77 h->Node->Read(h->Node, pagenum*PAGE_SIZE, PAGE_SIZE, mapping_dest);
79 pb->PhysAddrs[pagenum -> pb->BaseOffset] = MM_GetPhysAddr( mapping_dest );
83 MM_Map( mapping_dest, pb->PhysAddrs[pagenum - pb->BaseOffset] );
86 mapping_dest += PAGE_SIZE;
88 // Roll on to next block if needed
89 if(pagenum - pb->BaseOffset == MMAP_PAGES_PER_BLOCK)
91 if( pb->Next && pb->Next->BaseOffset == pagenum )
95 tVFS_MMapPageBlock *oldpb = pb;
96 pb = malloc( sizeof(tVFS_MMapPageBlock) );
97 pb->Next = oldpb->Next;
98 pb->BaseOffset = pagenum;
99 memset(pb->PhysAddrs, 0, sizeof(pb->PhysAddrs));
109 int VFS_MUnmap(int *ErrNo, void *Addr, size_t Length)