[SRU][Trusty][PATCH 1/7] mm: x86 pgtable: drop unneeded preprocessor ifdef

Juerg Haefliger juerg.haefliger at canonical.com
Wed Aug 22 06:40:15 UTC 2018


From: Cyrill Gorcunov <gorcunov at openvz.org>

_PAGE_BIT_FILE (bit 6) is always less than _PAGE_BIT_PROTNONE (bit 8), so
drop redundant #ifdef.

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
Cc: Linus Torvalds <torvalds at linux-foundation.org>
Cc: Mel Gorman <mgorman at suse.de>
Cc: Peter Anvin <hpa at zytor.com>
Cc: Ingo Molnar <mingo at kernel.org>
Cc: Steven Noonan <steven at uplinklabs.net>
Cc: Rik van Riel <riel at redhat.com>
Cc: David Vrabel <david.vrabel at citrix.com>
Cc: Peter Zijlstra <peterz at infradead.org>
Cc: Pavel Emelyanov <xemul at parallels.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

CVE-2018-3620
CVE-2018-3646

(backported from commit 2373eaecff33db5972bde9418f92d6401b4a945c)
[juergh:
 - Added additional comment from commit bcd11afa7ada
   ("x86/speculation/l1tf: Change order of offset/type in swap entry").
 - Added a compile-time error for _PAGE_BIT_FILE > _PAGE_BIT_PROTNONE.]
Signed-off-by: Juerg Haefliger <juergh at canonical.com>
---
 arch/x86/include/asm/pgtable-2level.h | 10 ----------
 arch/x86/include/asm/pgtable_64.h     | 21 +++++++++++++++------
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h
index c3625ecf5e3e..b405a0e5f053 100644
--- a/arch/x86/include/asm/pgtable-2level.h
+++ b/arch/x86/include/asm/pgtable-2level.h
@@ -105,13 +105,8 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
  */
 #define PTE_FILE_MAX_BITS	29
 #define PTE_FILE_SHIFT1		(_PAGE_BIT_PRESENT + 1)
-#if _PAGE_BIT_FILE < _PAGE_BIT_PROTNONE
 #define PTE_FILE_SHIFT2		(_PAGE_BIT_FILE + 1)
 #define PTE_FILE_SHIFT3		(_PAGE_BIT_PROTNONE + 1)
-#else
-#define PTE_FILE_SHIFT2		(_PAGE_BIT_PROTNONE + 1)
-#define PTE_FILE_SHIFT3		(_PAGE_BIT_FILE + 1)
-#endif
 #define PTE_FILE_BITS1		(PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1)
 #define PTE_FILE_BITS2		(PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1)
 
@@ -135,13 +130,8 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)
 #endif /* CONFIG_MEM_SOFT_DIRTY */
 
 /* Encode and de-code a swap entry */
-#if _PAGE_BIT_FILE < _PAGE_BIT_PROTNONE
 #define SWP_TYPE_BITS (_PAGE_BIT_FILE - _PAGE_BIT_PRESENT - 1)
 #define SWP_OFFSET_SHIFT (_PAGE_BIT_PROTNONE + 1)
-#else
-#define SWP_TYPE_BITS (_PAGE_BIT_PROTNONE - _PAGE_BIT_PRESENT - 1)
-#define SWP_OFFSET_SHIFT (_PAGE_BIT_FILE + 1)
-#endif
 
 #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS)
 
diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h
index 975962a32a20..a39a0afe65be 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -165,19 +165,28 @@ 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 */
 
+#if _PAGE_BIT_FILE > _PAGE_BIT_PROTNONE
+#error "Unsupported PTE bit arrangement"
+#endif
+
 /*
  * 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
+ * | TYPE (59-63) | ~OFFSET (9-58)  |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.
+ *
  * The offset is inverted by a binary not operation to make the high
  * physical bits set.
-*/
-#if _PAGE_BIT_FILE < _PAGE_BIT_PROTNONE
+ */
 #define SWP_TYPE_BITS		(_PAGE_BIT_FILE - _PAGE_BIT_PRESENT - 1)
 #define SWP_OFFSET_FIRST_BIT	(_PAGE_BIT_PROTNONE + 1)
-#else
-#define SWP_TYPE_BITS		(_PAGE_BIT_PROTNONE - _PAGE_BIT_PRESENT - 1)
-#define SWP_OFFSET_FIRST_BIT	(_PAGE_BIT_FILE + 1)
-#endif
 
 /* We always extract/encode the offset by shifting it all the way up, and then down again */
 #define SWP_OFFSET_SHIFT	(SWP_OFFSET_FIRST_BIT+SWP_TYPE_BITS)
-- 
2.17.1





More information about the kernel-team mailing list