git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel - Fixes from clang's scan-build tool
[tpg/acess2.git]
/
Kernel
/
vfs
/
mmap.c
diff --git
a/Kernel/vfs/mmap.c
b/Kernel/vfs/mmap.c
index
f8422bb
..
7c3fdf4
100644
(file)
--- a/
Kernel/vfs/mmap.c
+++ b/
Kernel/vfs/mmap.c
@@
-9,34
+9,38
@@
#include <vfs_int.h>
#define MMAP_PAGES_PER_BLOCK 16
#include <vfs_int.h>
#define MMAP_PAGES_PER_BLOCK 16
+#define PAGE_SIZE 0x1000 // Should be in mm_virt.h
// === STRUCTURES ===
// === 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 *Next;
Uint64 BaseOffset; // Must be a multiple of MMAP_PAGES_PER_BLOCK*PAGE_SIZE
tPAddr PhysAddrs[MMAP_PAGES_PER_BLOCK];
-}
tVFS_MMapPageBlock
;
+};
// === CODE ===
// === 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;
{
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;
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);
// 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;
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
);
prev = pb, pb = pb->Next
);
+ // - Allocate a block if needed
if( !pb || pb->BaseOffset > pagenum )
{
void *old_pb = pb;
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;
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;
}
h->Node->MMapInfo = pb;
}
+ // - Map (and allocate) pages
while( npages -- )
{
if( pb->PhysAddrs[pagenum - pb->BaseOffset] == 0 )
{
if( h->Node->MMap )
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
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
{
}
else
{
@@
-106,7
+115,7
@@
void *VFS_MMap(int *ErrNo, void *DestHint, size_t Length, int Protection, int Fl
return NULL;
}
return NULL;
}
-int VFS_MUnmap(
int *ErrNo,
void *Addr, size_t Length)
+int VFS_MUnmap(void *Addr, size_t Length)
{
return 0;
}
{
return 0;
}
UCC
git Repository :: git.ucc.asn.au