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
Changed spinlock mechananisim
[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
b3325c9
..
cb4f9e0
100644
(file)
--- a/
Kernel/arch/x86/mm_phys.c
+++ b/
Kernel/arch/x86/mm_phys.c
@@
-21,6
+21,7
@@
void MM_RefPhys(tPAddr PAddr);
void MM_DerefPhys(tPAddr PAddr);
// === GLOBALS ===
void MM_DerefPhys(tPAddr PAddr);
// === GLOBALS ===
+tMutex glPhysAlloc;
Uint64 giPhysAlloc = 0; // Number of allocated pages
Uint64 giPageCount = 0; // Total number of pages
Uint64 giLastPossibleFree = 0; // Last possible free page (before all pages are used)
Uint64 giPhysAlloc = 0; // Number of allocated pages
Uint64 giPageCount = 0; // Total number of pages
Uint64 giLastPossibleFree = 0; // Last possible free page (before all pages are used)
@@
-39,12
+40,10
@@
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;
@@
-91,12
+90,10
@@
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++)
{
@@
-134,7
+131,7
@@
tPAddr MM_AllocPhys(void)
ENTER("");
ENTER("");
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Find free page
// Scan downwards
// Find free page
// Scan downwards
@@
-166,7
+163,7
@@
tPAddr MM_AllocPhys(void)
LOG("a=%i,b=%i,c=%i", a, b, c);
for( ; gaSuperBitmap[a] == -1 && a >= 0; a-- );
if(a < 0) {
LOG("a=%i,b=%i,c=%i", a, b, c);
for( ; gaSuperBitmap[a] == -1 && a >= 0; a-- );
if(a < 0) {
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
@@
-192,7
+189,7
@@
tPAddr MM_AllocPhys(void)
gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31);
// Release Spinlock
gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31);
// Release Spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
LEAVE('X', ret);
//Log("MM_AllocPhys: RETURN 0x%x", ret);
LEAVE('X', ret);
//Log("MM_AllocPhys: RETURN 0x%x", ret);
@@
-221,7
+218,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
if(MaxBits > PHYS_BITS) MaxBits = PHYS_BITS;
// Lock
if(MaxBits > PHYS_BITS) MaxBits = PHYS_BITS;
// Lock
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Set up search state
if( giLastPossibleFree > ((tPAddr)1 << (MaxBits-12)) ) {
// Set up search state
if( giLastPossibleFree > ((tPAddr)1 << (MaxBits-12)) ) {
@@
-241,7
+238,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
// Find free page
for( ; gaSuperBitmap[a] == -1 && a --; ) b = 31;
if(a < 0) {
// Find free page
for( ; gaSuperBitmap[a] == -1 && a --; ) b = 31;
if(a < 0) {
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
@@
-299,7
+296,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
// Check if an address was found
if( idx < 0 ) {
// Check if an address was found
if( idx < 0 ) {
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
LEAVE('i', 0);
return 0;
@@
-322,7
+319,7
@@
tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
if(gaPageBitmap[ idx ] == -1) gaSuperBitmap[idx/32] |= 1 << (idx%32);
// Release Spinlock
if(gaPageBitmap[ idx ] == -1) gaSuperBitmap[idx/32] |= 1 << (idx%32);
// Release Spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
LEAVE('X', ret);
return ret;
LEAVE('X', ret);
return ret;
@@
-340,7
+337,7
@@
void MM_RefPhys(tPAddr PAddr)
if(PAddr >= giPageCount) return;
// Lock Structures
if(PAddr >= giPageCount) return;
// Lock Structures
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Reference the page
if(gaPageReferences)
// Reference the page
if(gaPageReferences)
@@
-354,7
+351,7
@@
void MM_RefPhys(tPAddr PAddr)
gaSuperBitmap[PAddr/1024] |= 1 << ((PAddr/32)&31);
// Release Spinlock
gaSuperBitmap[PAddr/1024] |= 1 << ((PAddr/32)&31);
// Release Spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
}
/**
}
/**
@@
-376,7
+373,7
@@
void MM_DerefPhys(tPAddr PAddr)
}
// Lock Structures
}
// Lock Structures
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
if( giLastPossibleFree < PAddr )
giLastPossibleFree = PAddr;
if( giLastPossibleFree < PAddr )
giLastPossibleFree = PAddr;
@@
-394,7
+391,7
@@
void MM_DerefPhys(tPAddr PAddr)
}
// Release spinlock
}
// Release spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
}
/**
}
/**
UCC
git Repository :: git.ucc.asn.au