#include <mm_virt.h>
#include <mm_phys.h>
#include <proc.h>
+#include <hal_proc.h>
#define TAB 22
typedef Uint32 tTabEnt;
// === IMPORTS ===
-extern void _UsertextEnd, _UsertextBase;
+extern char _UsertextEnd[], _UsertextBase[];
extern Uint32 gaInitPageDir[1024];
extern Uint32 gaInitPageTable[1024];
extern void Threads_SegFault(tVAddr Addr);
void MM_PreinitVirtual(void);
void MM_InstallVirtual(void);
void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs);
-void MM_DumpTables(tVAddr Start, tVAddr End);
-tVAddr MM_ClearUser(void);
+//void MM_DumpTables(tVAddr Start, tVAddr End);
+//void MM_ClearUser(void);
tPAddr MM_DuplicatePage(tVAddr VAddr);
// === GLOBALS ===
gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE;
}
- Log_Debug("MMVirt", "COW for %p (%P)", Addr, gaPageTable[Addr>>12]);
+// Log_Debug("MMVirt", "COW for %p (%P)", Addr, gaPageTable[Addr>>12]);
INVLPG( Addr & ~0xFFF );
return;
}
/**
- * \fn tVAddr MM_ClearUser()
* \brief Clear user's address space
*/
-tVAddr MM_ClearUser(void)
+void MM_ClearUser(void)
{
Uint i, j;
INVLPG( &gaPageTable[i*1024] );
}
INVLPG( gaPageDir );
-
- return *gpPageCR3;
}
/**
return ret;
}
+/**
+ * \brief Check if the provided buffer is valid
+ * \return Boolean valid
+ */
+int MM_IsValidBuffer(tVAddr Addr, size_t Size)
+{
+ int bIsUser;
+ int dir, tab;
+
+ Size += Addr & (PAGE_SIZE-1);
+ Addr &= ~(PAGE_SIZE-1);
+
+ dir = Addr >> 22;
+ tab = Addr >> 12;
+
+// Debug("Addr = %p, Size = 0x%x, dir = %i, tab = %i", Addr, Size, dir, tab);
+
+ if( !(gaPageDir[dir] & 1) ) return 0;
+ if( !(gaPageTable[tab] & 1) ) return 0;
+
+ bIsUser = !!(gaPageTable[tab] & PF_USER);
+
+ while( Size >= PAGE_SIZE )
+ {
+ if( (tab & 1023) == 0 )
+ {
+ dir ++;
+ if( !(gaPageDir[dir] & 1) ) return 0;
+ }
+
+ if( !(gaPageTable[tab] & 1) ) return 0;
+ if( bIsUser && !(gaPageTable[tab] & PF_USER) ) return 0;
+
+ tab ++;
+ Size -= PAGE_SIZE;
+ }
+ return 1;
+}
+
/**
* \fn tPAddr MM_DuplicatePage(tVAddr VAddr)
* \brief Duplicates a virtual page to a physical one