summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/include
diff options
context:
space:
mode:
authorjhibbits <jhibbits@FreeBSD.org>2016-02-11 13:15:37 +0000
committerjhibbits <jhibbits@FreeBSD.org>2016-02-11 13:15:37 +0000
commit323ead721e8c5d3d52d26da883d528cd729a0a91 (patch)
tree6d1e76c9f9dda03010468d439f8ddb7e95f516d5 /sys/powerpc/include
parent5d0577881561110fd5459b9f25120154e6198faf (diff)
downloadFreeBSD-src-323ead721e8c5d3d52d26da883d528cd729a0a91.zip
FreeBSD-src-323ead721e8c5d3d52d26da883d528cd729a0a91.tar.gz
Migrate the PTE format for book-e to standardize on the 'indirect PTE' format
Summary: The revised Book-E spec, adding the specification for the MMUv2 and e6500, includes a hardware PTE layout for indirect page tables. In order to support this in the future, migrate the PTE format to match the MMUv2 hardware PTE format. Test Plan: Boot tested on a P5020 board. Booted to multiuser mode. Differential Revision: https://reviews.freebsd.org/D5224
Diffstat (limited to 'sys/powerpc/include')
-rw-r--r--sys/powerpc/include/pte.h46
1 files changed, 23 insertions, 23 deletions
diff --git a/sys/powerpc/include/pte.h b/sys/powerpc/include/pte.h
index 3a27929..7108072 100644
--- a/sys/powerpc/include/pte.h
+++ b/sys/powerpc/include/pte.h
@@ -212,11 +212,7 @@ typedef struct lpte lpte_t;
* page size is 4k (12-bit mask), so RPN can really fit into 24 bits.
*/
#ifndef LOCORE
-struct pte {
- vm_offset_t rpn;
- uint32_t flags;
-};
-typedef struct pte pte_t;
+typedef uint64_t pte_t;
#endif
/* RPN mask, TLB0 4K pages */
@@ -225,13 +221,14 @@ typedef struct pte pte_t;
#if defined(BOOKE_E500)
/* PTE bits assigned to MAS2, MAS3 flags */
-#define PTE_W MAS2_W
-#define PTE_I MAS2_I
-#define PTE_M MAS2_M
-#define PTE_G MAS2_G
+#define PTE_MAS2_SHIFT 19
+#define PTE_W (MAS2_W << PTE_MAS2_SHIFT)
+#define PTE_I (MAS2_I << PTE_MAS2_SHIFT)
+#define PTE_M (MAS2_M << PTE_MAS2_SHIFT)
+#define PTE_G (MAS2_G << PTE_MAS2_SHIFT)
#define PTE_MAS2_MASK (MAS2_G | MAS2_M | MAS2_I | MAS2_W)
-#define PTE_MAS3_SHIFT 8
+#define PTE_MAS3_SHIFT 2
#define PTE_UX (MAS3_UX << PTE_MAS3_SHIFT)
#define PTE_SX (MAS3_SX << PTE_MAS3_SHIFT)
#define PTE_UW (MAS3_UW << PTE_MAS3_SHIFT)
@@ -241,6 +238,9 @@ typedef struct pte pte_t;
#define PTE_MAS3_MASK ((MAS3_UX | MAS3_SX | MAS3_UW \
| MAS3_SW | MAS3_UR | MAS3_SR) << PTE_MAS3_SHIFT)
+#define PTE_PS_SHIFT 8
+#define PTE_PS_4KB (2 << PTE_PS_SHIFT)
+
#elif defined(BOOKE_PPC4XX)
#define PTE_WL1 TLB_WL1
@@ -262,21 +262,21 @@ typedef struct pte pte_t;
#endif
/* Other PTE flags */
-#define PTE_VALID 0x80000000 /* Valid */
-#define PTE_MODIFIED 0x40000000 /* Modified */
-#define PTE_WIRED 0x20000000 /* Wired */
-#define PTE_MANAGED 0x10000000 /* Managed */
-#define PTE_REFERENCED 0x04000000 /* Referenced */
+#define PTE_VALID 0x00000001 /* Valid */
+#define PTE_MODIFIED 0x00001000 /* Modified */
+#define PTE_WIRED 0x00002000 /* Wired */
+#define PTE_MANAGED 0x00000002 /* Managed */
+#define PTE_REFERENCED 0x00040000 /* Referenced */
/* Macro argument must of pte_t type. */
-#define PTE_PA_SHIFT 12
-#define PTE_RPN_FROM_PA(pa) ((pa) >> PTE_PA_SHIFT)
-#define PTE_PA(pte) ((vm_paddr_t)((pte)->rpn) << PTE_PA_SHIFT)
-#define PTE_ISVALID(pte) ((pte)->flags & PTE_VALID)
-#define PTE_ISWIRED(pte) ((pte)->flags & PTE_WIRED)
-#define PTE_ISMANAGED(pte) ((pte)->flags & PTE_MANAGED)
-#define PTE_ISMODIFIED(pte) ((pte)->flags & PTE_MODIFIED)
-#define PTE_ISREFERENCED(pte) ((pte)->flags & PTE_REFERENCED)
+#define PTE_ARPN_SHIFT 12
+#define PTE_RPN_FROM_PA(pa) (((pa) & ~PAGE_MASK) << PTE_ARPN_SHIFT)
+#define PTE_PA(pte) ((vm_paddr_t)(*pte >> PTE_ARPN_SHIFT) & ~PAGE_MASK)
+#define PTE_ISVALID(pte) ((*pte) & PTE_VALID)
+#define PTE_ISWIRED(pte) ((*pte) & PTE_WIRED)
+#define PTE_ISMANAGED(pte) ((*pte) & PTE_MANAGED)
+#define PTE_ISMODIFIED(pte) ((*pte) & PTE_MODIFIED)
+#define PTE_ISREFERENCED(pte) ((*pte) & PTE_REFERENCED)
#endif /* BOOKE */
#endif /* _MACHINE_PTE_H_ */
OpenPOWER on IntegriCloud