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
More memory management functions implemented, other fixes too
[tpg/acess2.git]
/
Kernel
/
arch
/
x86
/
mm_phys.c
diff --git
a/Kernel/arch/x86/mm_phys.c
b/Kernel/arch/x86/mm_phys.c
index
e4199e3
..
f091c63
100644
(file)
--- a/
Kernel/arch/x86/mm_phys.c
+++ b/
Kernel/arch/x86/mm_phys.c
@@
-39,10
+39,12
@@
void MM_Install(tMBoot_Info *MBoot)
tMBoot_MMapEnt *ent;
// --- Find largest address
tMBoot_MMapEnt *ent;
// --- Find largest address
+ Log("MBoot->MMapAddr = %08x", MBoot->MMapAddr);
MBoot->MMapAddr |= KERNEL_BASE;
ent = (void *)( MBoot->MMapAddr );
while( (Uint)ent < MBoot->MMapAddr + MBoot->MMapLength )
{
MBoot->MMapAddr |= KERNEL_BASE;
ent = (void *)( MBoot->MMapAddr );
while( (Uint)ent < MBoot->MMapAddr + MBoot->MMapLength )
{
+ Log(" ent->Size = %08x", ent->Size);
// Adjust for size
ent->Size += 4;
// Adjust for size
ent->Size += 4;
@@
-71,7
+73,7
@@
void MM_Install(tMBoot_Info *MBoot)
ent = (tMBoot_MMapEnt *)( (Uint)ent + ent->Size );
}
ent = (tMBoot_MMapEnt *)( (Uint)ent + ent->Size );
}
- // Get used page count
+ // Get used page count
(Kernel)
kernelPages = (Uint)&gKernelEnd - KERNEL_BASE - 0x100000;
kernelPages += 0xFFF; // Page Align
kernelPages >>= 12;
kernelPages = (Uint)&gKernelEnd - KERNEL_BASE - 0x100000;
kernelPages += 0xFFF; // Page Align
kernelPages >>= 12;
@@
-89,10
+91,12
@@
void MM_Install(tMBoot_Info *MBoot)
// Mark Multiboot's pages as taken
// - Structure
MM_RefPhys( (Uint)MBoot - KERNEL_BASE );
// Mark Multiboot's pages as taken
// - Structure
MM_RefPhys( (Uint)MBoot - KERNEL_BASE );
+ Log("MBoot->ModuleCount = %i", MBoot->ModuleCount);
// - Module List
for(i = (MBoot->ModuleCount*sizeof(tMBoot_Module)+0xFFF)>12; i--; )
MM_RefPhys( MBoot->Modules + (i << 12) );
// - Modules
// - Module List
for(i = (MBoot->ModuleCount*sizeof(tMBoot_Module)+0xFFF)>12; i--; )
MM_RefPhys( MBoot->Modules + (i << 12) );
// - Modules
+ Log("MBoot->Modules = %p", MBoot->Modules);
mods = (void*)(MBoot->Modules + KERNEL_BASE);
for(i = 0; i < MBoot->ModuleCount; i++)
{
mods = (void*)(MBoot->Modules + KERNEL_BASE);
for(i = 0; i < MBoot->ModuleCount; i++)
{
@@
-207,8
+211,13
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
int i, idx, sidx;
tPAddr ret;
int i, idx, sidx;
tPAddr ret;
+ ENTER("iPages iMaxBits", Pages, MaxBits);
+
// Sanity Checks
// Sanity Checks
- if(MaxBits < 0) return 0;
+ if(MaxBits < 0) {
+ LEAVE('i', 0);
+ return 0;
+ }
if(MaxBits > PHYS_BITS) MaxBits = PHYS_BITS;
// Lock
if(MaxBits > PHYS_BITS) MaxBits = PHYS_BITS;
// Lock
@@
-226,16
+235,28
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
b = idx % 32;
a = idx / 32;
b = idx % 32;
a = idx / 32;
+ #if 0
+ LOG("a=%i, b=%i, idx=%i, sidx=%i", a, b, idx, sidx);
+
// Find free page
// Find free page
- for( ; gaSuperBitmap[a] == -1 && a --; );
+ for( ; gaSuperBitmap[a] == -1 && a --; )
b = 31
;
if(a < 0) {
RELEASE( &giPhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
if(a < 0) {
RELEASE( &giPhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
+ LEAVE('i', 0);
return 0;
}
return 0;
}
- for( ; gaSuperBitmap[a] & (1 << b); b-- );
+ LOG("a = %i", a);
+ for( ; gaSuperBitmap[a] & (1 << b); b-- ) sidx = 31;
+ LOG("b = %i", b);
idx = a * 32 + b;
idx = a * 32 + b;
- for( ; gaPageBitmap[idx] & (1 << sidx); sidx-- );
+ for( ; gaPageBitmap[idx] & (1 << sidx); sidx-- )
+ LOG("gaPageBitmap[%i] = 0x%08x", idx, gaPageBitmap[idx]);
+
+ LOG("idx = %i, sidx = %i", idx, sidx);
+ #else
+
+ #endif
// Check if the gap is large enough
while( idx >= 0 )
// Check if the gap is large enough
while( idx >= 0 )
@@
-280,6
+301,8
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
if( idx < 0 ) {
RELEASE( &giPhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
if( idx < 0 ) {
RELEASE( &giPhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
+ LEAVE('i', 0);
+ return 0;
}
// Mark pages used
}
// Mark pages used
@@
-289,7
+312,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
gaPageReferences[idx*32+sidx] = 1;
gaPageBitmap[ idx ] |= 1 << sidx;
sidx ++;
gaPageReferences[idx*32+sidx] = 1;
gaPageBitmap[ idx ] |= 1 << sidx;
sidx ++;
- if(sidx == 32) {
sidx = 0;
idx ++; }
+ if(sidx == 32) {
sidx = 0;
idx ++; }
}
// Get address
}
// Get address
@@
-301,6
+324,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
// Release Spinlock
RELEASE( &giPhysAlloc );
// Release Spinlock
RELEASE( &giPhysAlloc );
+ LEAVE('X', ret);
return ret;
}
return ret;
}
UCC
git Repository :: git.ucc.asn.au