+/**
+ * \brief Get the page table entry of a virtual address
+ * \param Addr Virtual Address
+ * \param Phys Location to put the physical address
+ * \param Flags Flags on the entry (set to zero if unmapped)
+ * \return Size of the entry (in address bits) - 12 = 4KiB page
+ */
+int MM_GetPageEntry(tVAddr Addr, tPAddr *Phys, Uint *Flags)
+{
+ if(!Phys || !Flags) return 0;
+
+ // Check if the PML4 entry is present
+ if( !(PAGEMAPLVL4(Addr >> 39) & 1) ) {
+ *Phys = 0;
+ *Flags = 0;
+ return 39;
+ }
+ // - Check for large page
+ if( PAGEMAPLVL4(Addr >> 39) & PF_LARGE ) {
+ *Phys = PAGEMAPLVL4(Addr >> 39) & ~0xFFF;
+ *Flags = PAGEMAPLVL4(Addr >> 39) & 0xFFF;
+ return 39;
+ }
+
+ // Check the PDP entry
+ if( !(PAGEDIRPTR(Addr >> 30) & 1) ) {
+ *Phys = 0;
+ *Flags = 0;
+ return 30;
+ }
+ // - Check for large page
+ if( PAGEDIRPTR(Addr >> 30) & PF_LARGE ) {
+ *Phys = PAGEDIRPTR(Addr >> 30) & ~0xFFF;
+ *Flags = PAGEDIRPTR(Addr >> 30) & 0xFFF;
+ return 30;
+ }
+
+ // Check PDIR Entry
+ if( !(PAGEDIR(Addr >> 21) & 1) ) {
+ *Phys = 0;
+ *Flags = 0;
+ return 21;
+ }
+ // - Check for large page
+ if( PAGEDIR(Addr >> 21) & PF_LARGE ) {
+ *Phys = PAGEDIR(Addr >> 21) & ~0xFFF;
+ *Flags = PAGEDIR(Addr >> 21) & 0xFFF;
+ return 21;
+ }
+
+ // And, check the page table entry
+ if( !(PAGETABLE(Addr >> PTAB_SHIFT) & 1) ) {
+ *Phys = 0;
+ *Flags = 0;
+ }
+ else {
+ *Phys = PAGETABLE(Addr >> PTAB_SHIFT) & ~0xFFF;
+ *Flags = PAGETABLE(Addr >> PTAB_SHIFT) & 0xFFF;
+ }
+ return 12;
+}
+