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
595a5e9
..
cb4f9e0
100644
(file)
--- a/
Kernel/arch/x86/mm_phys.c
+++ b/
Kernel/arch/x86/mm_phys.c
@@
-15,12
+15,13
@@
extern void gKernelEnd;
// === PROTOTYPES ===
extern void gKernelEnd;
// === PROTOTYPES ===
-tPAddr MM_AllocPhys();
+tPAddr MM_AllocPhys(
void
);
tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
-void MM_RefPhys(tPAddr Addr);
-void MM_DerefPhys(tPAddr Addr);
+void MM_RefPhys(tPAddr
P
Addr);
+void MM_DerefPhys(tPAddr
P
Addr);
// === GLOBALS ===
// === 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)
@@
-71,7
+72,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;
@@
-119,10
+120,10
@@
void MM_Install(tMBoot_Info *MBoot)
}
/**
}
/**
- * \fn tPAddr MM_AllocPhys()
+ * \fn tPAddr MM_AllocPhys(
void
)
* \brief Allocates a physical page from the general pool
*/
* \brief Allocates a physical page from the general pool
*/
-tPAddr MM_AllocPhys()
+tPAddr MM_AllocPhys(
void
)
{
// int a, b, c;
int indx;
{
// int a, b, c;
int indx;
@@
-130,7
+131,7
@@
tPAddr MM_AllocPhys()
ENTER("");
ENTER("");
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Find free page
// Scan downwards
// Find free page
// Scan downwards
@@
-162,7
+163,7
@@
tPAddr MM_AllocPhys()
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;
@@
-188,7
+189,7
@@
tPAddr MM_AllocPhys()
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);
@@
-207,12
+208,17
@@
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
-
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)) ) {
@@
-226,16
+232,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) {
if(a < 0) {
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
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 )
@@
-278,8
+296,10
@@
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));
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
+309,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
@@
-299,76
+319,79
@@
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;
}
/**
return ret;
}
/**
- * \fn void MM_RefPhys(tPAddr Addr)
+ * \fn void MM_RefPhys(tPAddr
P
Addr)
*/
*/
-void MM_RefPhys(tPAddr Addr)
+void MM_RefPhys(tPAddr
P
Addr)
{
// Get page number
{
// Get page number
- Addr >>= 12;
+
P
Addr >>= 12;
// We don't care about non-ram pages
// We don't care about non-ram pages
- if(
Addr >= giPageCount)
return;
+ if(
PAddr >= giPageCount)
return;
// Lock Structures
// Lock Structures
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Reference the page
if(gaPageReferences)
// Reference the page
if(gaPageReferences)
- gaPageReferences[ Addr ] ++;
+ gaPageReferences[
P
Addr ] ++;
// Mark as used
// Mark as used
- gaPageBitmap[
Addr / 32 ] |= 1 << (
Addr&31);
+ gaPageBitmap[
PAddr / 32 ] |= 1 << (P
Addr&31);
// Mark used block
// Mark used block
- if(gaPageBitmap[ Addr / 32 ] == -1) gaSuperBitmap[Addr/1024] |= 1 << ((Addr/32)&31);
+ if(gaPageBitmap[ PAddr / 32 ] == -1)
+ gaSuperBitmap[PAddr/1024] |= 1 << ((PAddr/32)&31);
// Release Spinlock
// Release Spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
}
/**
}
/**
- * \fn void MM_DerefPhys(Uint32 Addr)
+ * \fn void MM_DerefPhys(tPAddr PAddr)
+ * \brief Dereferences a physical page
*/
*/
-void MM_DerefPhys(tPAddr Addr)
+void MM_DerefPhys(tPAddr
P
Addr)
{
// Get page number
{
// Get page number
- Addr >>= 12;
+
P
Addr >>= 12;
// We don't care about non-ram pages
// We don't care about non-ram pages
- if(
Addr >= giPageCount)
return;
+ if(
PAddr >= giPageCount)
return;
// Check if it is freed
// Check if it is freed
- if(gaPageReferences[ Addr ] == 0) {
+ if(gaPageReferences[
P
Addr ] == 0) {
Warning("MM_DerefPhys - Non-referenced memory dereferenced");
return;
}
// Lock Structures
Warning("MM_DerefPhys - Non-referenced memory dereferenced");
return;
}
// Lock Structures
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
- if( giLastPossibleFree < Addr )
- giLastPossibleFree = Addr;
+ if( giLastPossibleFree <
P
Addr )
+ giLastPossibleFree =
P
Addr;
// Dereference
// Dereference
- gaPageReferences[ Addr ] --;
+ gaPageReferences[
P
Addr ] --;
// Mark as free in bitmaps
// Mark as free in bitmaps
- if( gaPageReferences[ Addr ] == 0 )
+ if( gaPageReferences[
P
Addr ] == 0 )
{
{
- //LOG("Freed 0x%x by %p\n", Addr<<12, __builtin_return_address(0));
- gaPageBitmap[
Addr / 32 ] &= ~(1 << (
Addr&31));
- if(gaPageReferences[ Addr ] == 0)
- gaSuperBitmap[
Addr >> 10 ] &= ~(1 << ((
Addr >> 5)&31));
+ //LOG("Freed 0x%x by %p\n",
P
Addr<<12, __builtin_return_address(0));
+ gaPageBitmap[
PAddr / 32 ] &= ~(1 << (P
Addr&31));
+ if(gaPageReferences[
P
Addr ] == 0)
+ gaSuperBitmap[
PAddr >> 10 ] &= ~(1 << ((P
Addr >> 5)&31));
}
// Release spinlock
}
// Release spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
}
/**
}
/**
UCC
git Repository :: git.ucc.asn.au