From 60b2fc86f5aed670e5a18ca7ae0c7f510659050a Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Fri, 7 Oct 2011 16:42:07 +0800
Subject: [PATCH] Kernel/arm7 - Implementing some MMU functions

---
 Kernel/arch/armv7/mm_virt.c | 64 +++++++++++++++++++++++++++++++++++--
 Kernel/include/acess.h      |  2 +-
 2 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/Kernel/arch/armv7/mm_virt.c b/Kernel/arch/armv7/mm_virt.c
index 0fc426d4..1090b0ec 100644
--- a/Kernel/arch/armv7/mm_virt.c
+++ b/Kernel/arch/armv7/mm_virt.c
@@ -195,8 +195,6 @@ int MM_int_SetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
 	return 1;
 }
 
-extern tShortSpinlock	glDebug_Lock;
-
 int MM_int_GetPageInfo(tVAddr VAddr, tMM_PageInfo *pi)
 {
 	Uint32	*table0, *table1;
@@ -383,13 +381,73 @@ tPAddr MM_ClearUser(void)
 
 tVAddr MM_MapTemp(tPAddr PAddr)
 {
-	// TODO: Implement MapTemp
+	tVAddr	ret;
+	tMM_PageInfo	pi;
+	
+	for( ret = MM_TMPMAP_BASE; ret < MM_TMPMAP_END - PAGE_SIZE; ret += PAGE_SIZE )
+	{
+		if( MM_int_GetPageInfo(ret, &pi) == 0 )
+			continue;
+	
+		MM_Map(ret, PAddr);
+		
+		return ret;
+	}
+	Log_Warning("MMVirt", "MM_MapTemp: All slots taken");
 	return 0;
 }
 
 void MM_FreeTemp(tVAddr VAddr)
 {
 	// TODO: Implement FreeTemp
+	if( VAddr < MM_TMPMAP_BASE || VAddr >= MM_TMPMAP_END ) {
+		Log_Warning("MMVirt", "MM_FreeTemp: Passed an addr not from MM_MapTemp (%p)", VAddr);
+		return ;
+	}
+	
+	MM_Deallocate(VAddr);
+}
+
+tVAddr MM_MapHWPages(tPAddr PAddr, Uint NPages)
+{
+	tVAddr	ret;
+	 int	i;
+	tMM_PageInfo	pi;
+
+	// Scan for a location
+	for( ret = MM_HWMAP_BASE; ret < MM_HWMAP_END - NPages * PAGE_SIZE; ret += PAGE_SIZE )
+	{
+		// Check if there is `NPages` free pages
+		for( i = 0; i < NPages; i ++ )
+		{
+			if( MM_int_GetPageInfo(ret + i*PAGE_SIZE, &pi) == 0 )
+				break;
+		}
+		// Nope, jump to after the used page found and try again
+		if( i != NPages ) {
+			ret += i * PAGE_SIZE;
+			continue ;
+		}
+	
+		// Map the pages	
+		for( i = 0; i < NPages; i ++ )
+			MM_Map(ret+i*PAGE_SIZE, PAddr+i*PAddr);
+		// and return
+		return ret;
+	}
+	Log_Warning("MMVirt", "MM_MapHWPages: No space for a %i page block", NPages);
+	return 0;
+}
+
+tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PAddr)
+{
+	Log_Error("MMVirt", "TODO: Implement MM_AllocDMA");
+	return 0;
+}
+
+void MM_UnmapHWPages(tVAddr Vaddr, Uint Number)
+{
+	Log_Error("MMVirt", "TODO: Implement MM_UnmapHWPages");
 }
 
 tVAddr MM_NewKStack(int bShared)
diff --git a/Kernel/include/acess.h b/Kernel/include/acess.h
index 3d0b3b32..a956d148 100644
--- a/Kernel/include/acess.h
+++ b/Kernel/include/acess.h
@@ -266,7 +266,7 @@ extern tVAddr	MM_MapHWPages(tPAddr PAddr, Uint Number);
 extern tVAddr	MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr);
 /**
  * \brief Unmaps an allocated hardware range
- * \param VAddr	Virtual address allocate by ::MM_MapHWPage or ::MM_AllocDMA
+ * \param VAddr	Virtual address allocate by ::MM_MapHWPages or ::MM_AllocDMA
  * \param Number	Number of pages to free
  */
 extern void	MM_UnmapHWPages(tVAddr VAddr, Uint Number);
-- 
GitLab