]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/x86/include/asm/pgtable_64.h
Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / arch / x86 / include / asm / pgtable_64.h
index 2ee781114d3480fa1f1136f0e434b7862a361886..7e8ec7ae10faff67a1c6fd26314ed53be3ed598f 100644 (file)
@@ -140,18 +140,32 @@ static inline int pgd_large(pgd_t pgd) { return 0; }
 #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address))
 #define pte_unmap(pte) ((void)(pte))/* NOP */
 
-/* Encode and de-code a swap entry */
+/*
+ * Encode and de-code a swap entry
+ *
+ * |     ...            | 11| 10|  9|8|7|6|5| 4| 3|2|1|0| <- bit number
+ * |     ...            |SW3|SW2|SW1|G|L|D|A|CD|WT|U|W|P| <- bit names
+ * | OFFSET (14->63) | TYPE (10-13) |0|X|X|X| X| X|X|X|0| <- swp entry
+ *
+ * G (8) is aliased and used as a PROT_NONE indicator for
+ * !present ptes.  We need to start storing swap entries above
+ * there.  We also need to avoid using A and D because of an
+ * erratum where they can be incorrectly set by hardware on
+ * non-present PTEs.
+ */
+#define SWP_TYPE_FIRST_BIT (_PAGE_BIT_PROTNONE + 1)
 #define SWP_TYPE_BITS 5
-#define SWP_OFFSET_SHIFT (_PAGE_BIT_PROTNONE + 1)
+/* Place the offset above the type: */
+#define SWP_OFFSET_FIRST_BIT (SWP_TYPE_FIRST_BIT + SWP_TYPE_BITS + 1)
 
 #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS)
 
-#define __swp_type(x)                  (((x).val >> (_PAGE_BIT_PRESENT + 1)) \
+#define __swp_type(x)                  (((x).val >> (SWP_TYPE_FIRST_BIT)) \
                                         & ((1U << SWP_TYPE_BITS) - 1))
-#define __swp_offset(x)                        ((x).val >> SWP_OFFSET_SHIFT)
+#define __swp_offset(x)                        ((x).val >> SWP_OFFSET_FIRST_BIT)
 #define __swp_entry(type, offset)      ((swp_entry_t) { \
-                                        ((type) << (_PAGE_BIT_PRESENT + 1)) \
-                                        | ((offset) << SWP_OFFSET_SHIFT) })
+                                        ((type) << (SWP_TYPE_FIRST_BIT)) \
+                                        | ((offset) << SWP_OFFSET_FIRST_BIT) })
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val((pte)) })
 #define __swp_entry_to_pte(x)          ((pte_t) { .pte = (x).val })