Added PAGE_PRESENT, PAGE_UNMAPPED, PAGE_PAGED_OUT
authorAndrew Waterman <waterman@ros-dev.(none)>
Fri, 26 Mar 2010 22:20:07 +0000 (15:20 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:38 +0000 (17:35 -0700)
These macros are helpful for page table management.
At this point, only the first two can be true.  In
general, exactly one must be true for any PTE.

kern/arch/i686/mmu.h
kern/arch/sparc/mmu.h

index 00712da..7c4ebbd 100644 (file)
@@ -384,6 +384,18 @@ typedef struct Pseudodesc {
 extern segdesc_t (COUNT(SEG_COUNT) RO gdt)[];
 extern pseudodesc_t gdt_pd;
 
+// we must guarantee that for any PTE, exactly one of the following is true
+#define PAGE_PRESENT(pte) ((pte) & PTE_P)
+#define PAGE_UNMAPPED(pte) ((pte) == 0)
+#define PAGE_PAGED_OUT(pte) (!PAGE_PRESENT(pte) && !PAGE_UNMAPPED(pte))
+
+// get the pfault_info pointer stored in this PTE.
+// useless unless PAGE_PAGED_OUT(pte).
+#define PTE2PFAULT_INFO(pte) ((struct pfault_info*)pte)
+// convert a pfault_info pointer to a PTE.
+// assumes the pointer is 4-byte aligned.
+#define PFAULT_INFO2PTE(ptr) ((pte_t)ptr)
+
 #endif /* !__ASSEMBLER__ */
 
 #endif /* !ROS_INC_MMU_H */
index 9307280..4a67804 100644 (file)
 #define MMU_REG_FSR    0x00000300      // MMU Fault Status Register
 #define MMU_REG_FAR    0x00000400      // MMU Fault Address Register
 
+// we must guarantee that for any PTE, exactly one of the following is true
+#define PAGE_PRESENT(pte) ((pte) & PTE_P)
+#define PAGE_UNMAPPED(pte) ((pte) == 0)
+#define PAGE_PAGED_OUT(pte) (!PAGE_PRESENT(pte) && !PAGE_UNMAPPED(pte))
+
+// get the pfault_info pointer stored in this PTE.
+// useless unless PAGE_PAGED_OUT(pte).
+#define PTE2PFAULT_INFO(pte) ((struct pfault_info*)pte)
+// convert a pfault_info pointer to a PTE.
+// assumes the pointer is 4-byte aligned.
+#define PFAULT_INFO2PTE(ptr) ((pte_t)ptr)
+
 #endif /* !ROS_INC_MMU_H */