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
Cleaning up some misc files
[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
f091c63
..
3abe413
100644
(file)
--- a/
Kernel/arch/x86/mm_phys.c
+++ b/
Kernel/arch/x86/mm_phys.c
@@
-7,7
+7,8
@@
#include <mboot.h>
#include <mm_virt.h>
#include <mboot.h>
#include <mm_virt.h>
-#define USE_STACK 1
+//#define USE_STACK 1
+#define TRACE_ALLOCS 0 // Print trace messages on AllocPhys/DerefPhys
#define REFERENCE_BASE 0xE0400000
#define REFERENCE_BASE 0xE0400000
@@
-15,12
+16,13
@@
extern void gKernelEnd;
// === PROTOTYPES ===
extern void gKernelEnd;
// === PROTOTYPES ===
-tPAddr MM_AllocPhys();
+tPAddr MM_AllocPhys(
void
);
tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
void MM_RefPhys(tPAddr PAddr);
void MM_DerefPhys(tPAddr PAddr);
// === GLOBALS ===
tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
void MM_RefPhys(tPAddr PAddr);
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
+41,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
+91,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++)
{
@@
-123,10
+121,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;
@@
-134,7
+132,7
@@
tPAddr MM_AllocPhys()
ENTER("");
ENTER("");
-
LOCK( &gi
PhysAlloc );
+
Mutex_Acquire( &gl
PhysAlloc );
// Find free page
// Scan downwards
// Find free page
// Scan downwards
@@
-146,6
+144,7
@@
tPAddr MM_AllocPhys()
indx -= 1024;
continue;
}
indx -= 1024;
continue;
}
+
if( gaPageBitmap[indx>>5] == -1 ) {
indx -= 32;
continue;
if( gaPageBitmap[indx>>5] == -1 ) {
indx -= 32;
continue;
@@
-166,7
+165,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;
@@
-177,11
+176,23
@@
tPAddr MM_AllocPhys()
indx = (a << 10) | (b << 5) | c;
#endif
indx = (a << 10) | (b << 5) | c;
#endif
+ if( indx < 0 ) {
+ Mutex_Release( &glPhysAlloc );
+ Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
+ LEAVE('i', 0);
+ return 0;
+ }
+
+ if( indx > 0xFFFFF ) {
+ Panic("The fuck? Too many pages! (indx = 0x%x)", indx);
+ }
+
// Mark page used
if(gaPageReferences)
gaPageReferences[ indx ] = 1;
gaPageBitmap[ indx>>5 ] |= 1 << (indx&31);
// Mark page used
if(gaPageReferences)
gaPageReferences[ indx ] = 1;
gaPageBitmap[ indx>>5 ] |= 1 << (indx&31);
+ giPhysAlloc ++;
// Get address
ret = indx << 12;
// Get address
ret = indx << 12;
@@
-192,10
+203,12
@@
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);
LEAVE('X', ret);
- //Log("MM_AllocPhys: RETURN 0x%x", ret);
+ #if TRACE_ALLOCS
+ Log_Debug("PMem", "MM_AllocPhys: RETURN 0x%llx (%i free)", ret, giPageCount-giPhysAlloc);
+ #endif
return ret;
}
return ret;
}
@@
-221,7
+234,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
+254,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
+312,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;
@@
-312,6
+325,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 ++;
+ giPhysAlloc ++;
if(sidx == 32) { sidx = 0; idx ++; }
}
if(sidx == 32) { sidx = 0; idx ++; }
}
@@
-322,9
+336,13
@@
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);
LEAVE('X', ret);
+ #if TRACE_ALLOCS
+ Log_Debug("PMem", "MM_AllocPhysRange: RETURN 0x%llx-0x%llx (%i free)",
+ ret, ret + (1<<Pages)-1, giPageCount-giPhysAlloc);
+ #endif
return ret;
}
return ret;
}
@@
-340,7
+358,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
+372,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
+394,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;
@@
-387,14
+405,18
@@
void MM_DerefPhys(tPAddr PAddr)
// Mark as free in bitmaps
if( gaPageReferences[ PAddr ] == 0 )
{
// Mark as free in bitmaps
if( gaPageReferences[ PAddr ] == 0 )
{
+ #if TRACE_ALLOCS
+ Log_Debug("PMem", "MM_DerefPhys: Free'd 0x%x (%i free)", PAddr, giPageCount-giPhysAlloc);
+ #endif
//LOG("Freed 0x%x by %p\n", PAddr<<12, __builtin_return_address(0));
//LOG("Freed 0x%x by %p\n", PAddr<<12, __builtin_return_address(0));
+ giPhysAlloc --;
gaPageBitmap[ PAddr / 32 ] &= ~(1 << (PAddr&31));
if(gaPageReferences[ PAddr ] == 0)
gaSuperBitmap[ PAddr >> 10 ] &= ~(1 << ((PAddr >> 5)&31));
}
// Release spinlock
gaPageBitmap[ PAddr / 32 ] &= ~(1 << (PAddr&31));
if(gaPageReferences[ PAddr ] == 0)
gaSuperBitmap[ PAddr >> 10 ] &= ~(1 << ((PAddr >> 5)&31));
}
// Release spinlock
-
RELEASE( &gi
PhysAlloc );
+
Mutex_Release( &gl
PhysAlloc );
}
/**
}
/**
UCC
git Repository :: git.ucc.asn.au