|
@@ -96,3 +96,73 @@ extern unsigned long empty_zero_page;
|
|
|
* Page Directory:
|
|
|
* - Size: 16KB
|
|
|
* - 64 PGEs per PGD
|
|
|
+ * - Each PGE holds 1 PUD and covers 64MB
|
|
|
+ *
|
|
|
+ * Page Upper Directory:
|
|
|
+ * - Size: 256B
|
|
|
+ * - 1 PUE per PUD
|
|
|
+ * - Each PUE holds 1 PMD and covers 64MB
|
|
|
+ *
|
|
|
+ * Page Mid-Level Directory
|
|
|
+ * - Size: 256B
|
|
|
+ * - 1 PME per PMD
|
|
|
+ * - Each PME holds 64 STEs, all of which point to separate chunks of the same Page Table
|
|
|
+ * - All STEs are instantiated at the same time
|
|
|
+ *
|
|
|
+ * Page Table
|
|
|
+ * - Size: 16KB
|
|
|
+ * - 4096 PTEs per PT
|
|
|
+ * - Each Linux PT is subdivided into 64 FR451 PT's, each of which holds 64 entries
|
|
|
+ *
|
|
|
+ * Pages
|
|
|
+ * - Size: 4KB
|
|
|
+ *
|
|
|
+ * total PTEs
|
|
|
+ * = 1 PML4E * 64 PGEs * 1 PUEs * 1 PMEs * 4096 PTEs
|
|
|
+ * = 1 PML4E * 64 PGEs * 64 STEs * 64 PTEs/FR451-PT
|
|
|
+ * = 262144 (or 256 * 1024)
|
|
|
+ */
|
|
|
+#define PGDIR_SHIFT 26
|
|
|
+#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
|
|
|
+#define PGDIR_MASK (~(PGDIR_SIZE - 1))
|
|
|
+#define PTRS_PER_PGD 64
|
|
|
+
|
|
|
+#define PUD_SHIFT 26
|
|
|
+#define PTRS_PER_PUD 1
|
|
|
+#define PUD_SIZE (1UL << PUD_SHIFT)
|
|
|
+#define PUD_MASK (~(PUD_SIZE - 1))
|
|
|
+#define PUE_SIZE 256
|
|
|
+
|
|
|
+#define PMD_SHIFT 26
|
|
|
+#define PMD_SIZE (1UL << PMD_SHIFT)
|
|
|
+#define PMD_MASK (~(PMD_SIZE - 1))
|
|
|
+#define PTRS_PER_PMD 1
|
|
|
+#define PME_SIZE 256
|
|
|
+
|
|
|
+#define __frv_PT_SIZE 256
|
|
|
+
|
|
|
+#define PTRS_PER_PTE 4096
|
|
|
+
|
|
|
+#define USER_PGDS_IN_LAST_PML4 (TASK_SIZE / PGDIR_SIZE)
|
|
|
+#define FIRST_USER_ADDRESS 0
|
|
|
+
|
|
|
+#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
|
|
|
+#define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS)
|
|
|
+
|
|
|
+#define TWOLEVEL_PGDIR_SHIFT 26
|
|
|
+#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT)
|
|
|
+#define BOOT_KERNEL_PGD_PTRS (PTRS_PER_PGD - BOOT_USER_PGD_PTRS)
|
|
|
+
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
+
|
|
|
+extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
|
|
+
|
|
|
+#define pte_ERROR(e) \
|
|
|
+ printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte)
|
|
|
+#define pmd_ERROR(e) \
|
|
|
+ printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
|
|
|
+#define pud_ERROR(e) \
|
|
|
+ printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(e)))
|
|
|
+#define pgd_ERROR(e) \
|
|
|
+ printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(pgd_val(e))))
|
|
|
+
|