|
@@ -373,6 +373,38 @@ extern void slb_set_size(u16 size);
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
+#ifdef CONFIG_PPC_SUBPAGE_PROT
|
|
|
+/*
|
|
|
+ * For the sub-page protection option, we extend the PGD with one of
|
|
|
+ * these. Basically we have a 3-level tree, with the top level being
|
|
|
+ * the protptrs array. To optimize speed and memory consumption when
|
|
|
+ * only addresses < 4GB are being protected, pointers to the first
|
|
|
+ * four pages of sub-page protection words are stored in the low_prot
|
|
|
+ * array.
|
|
|
+ * Each page of sub-page protection words protects 1GB (4 bytes
|
|
|
+ * protects 64k). For the 3-level tree, each page of pointers then
|
|
|
+ * protects 8TB.
|
|
|
+ */
|
|
|
+struct subpage_prot_table {
|
|
|
+ unsigned long maxaddr; /* only addresses < this are protected */
|
|
|
+ unsigned int **protptrs[2];
|
|
|
+ unsigned int *low_prot[4];
|
|
|
+};
|
|
|
+
|
|
|
+#define SBP_L1_BITS (PAGE_SHIFT - 2)
|
|
|
+#define SBP_L2_BITS (PAGE_SHIFT - 3)
|
|
|
+#define SBP_L1_COUNT (1 << SBP_L1_BITS)
|
|
|
+#define SBP_L2_COUNT (1 << SBP_L2_BITS)
|
|
|
+#define SBP_L2_SHIFT (PAGE_SHIFT + SBP_L1_BITS)
|
|
|
+#define SBP_L3_SHIFT (SBP_L2_SHIFT + SBP_L2_BITS)
|
|
|
+
|
|
|
+extern void subpage_prot_free(struct mm_struct *mm);
|
|
|
+extern void subpage_prot_init_new_context(struct mm_struct *mm);
|
|
|
+#else
|
|
|
+static inline void subpage_prot_free(struct mm_struct *mm) {}
|
|
|
+static inline void subpage_prot_init_new_context(struct mm_struct *mm) { }
|
|
|
+#endif /* CONFIG_PPC_SUBPAGE_PROT */
|
|
|
+
|
|
|
typedef unsigned long mm_context_id_t;
|
|
|
|
|
|
typedef struct {
|
|
@@ -386,6 +418,9 @@ typedef struct {
|
|
|
u16 sllp; /* SLB page size encoding */
|
|
|
#endif
|
|
|
unsigned long vdso_base;
|
|
|
+#ifdef CONFIG_PPC_SUBPAGE_PROT
|
|
|
+ struct subpage_prot_table spt;
|
|
|
+#endif /* CONFIG_PPC_SUBPAGE_PROT */
|
|
|
} mm_context_t;
|
|
|
|
|
|
|