X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fmmap.c;h=7c3fdf4bc5c16f88936adac4d29023daf8765e7a;hb=952891ddb96a341c0e24ecb7dec6361c7bbeaece;hp=f8422bbd7dfbafdbeb33b4691cbf628712d62839;hpb=8b7dec58d79aad0ba8467a15c353eade8ad5592b;p=tpg%2Facess2.git diff --git a/Kernel/vfs/mmap.c b/Kernel/vfs/mmap.c index f8422bbd..7c3fdf4b 100644 --- a/Kernel/vfs/mmap.c +++ b/Kernel/vfs/mmap.c @@ -9,34 +9,38 @@ #include #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; }