Add definitions for the bit masks/shifts/sizes, and implement
MAX_SWAPFILES_CHECK() such that we fail to build if we are
unable to properly encode the swp type field.

Signed-off-by: Youling Tang <[email protected]>
---
 arch/mips/include/asm/pgtable-32.h | 32 ++++++++++++++++++++------------
 arch/mips/include/asm/pgtable-64.h | 18 +++++++++++++++---
 2 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/arch/mips/include/asm/pgtable-32.h 
b/arch/mips/include/asm/pgtable-32.h
index 6c0532d..3ec12ce 100644
--- a/arch/mips/include/asm/pgtable-32.h
+++ b/arch/mips/include/asm/pgtable-32.h
@@ -201,9 +201,8 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t 
prot)
 #if defined(CONFIG_CPU_R3K_TLB)
 
 /* Swap entries must have VALID bit cleared. */
-#define __swp_type(x)                  (((x).val >> 10) & 0x1f)
-#define __swp_offset(x)                        ((x).val >> 15)
-#define __swp_entry(type,offset)       ((swp_entry_t) { ((type) << 10) | 
((offset) << 15) })
+#define __SWP_TYPE_SHIFT       10
+
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
@@ -212,18 +211,16 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t 
prot)
 #if defined(CONFIG_XPA)
 
 /* Swap entries must have VALID and GLOBAL bits cleared. */
-#define __swp_type(x)                  (((x).val >> 4) & 0x1f)
-#define __swp_offset(x)                         ((x).val >> 9)
-#define __swp_entry(type,offset)       ((swp_entry_t)  { ((type) << 4) | 
((offset) << 9) })
+#define __SWP_TYPE_SHIFT       4
+
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { (pte).pte_high 
})
 #define __swp_entry_to_pte(x)          ((pte_t) { 0, (x).val })
 
 #elif defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
 
 /* Swap entries must have VALID and GLOBAL bits cleared. */
-#define __swp_type(x)                  (((x).val >> 2) & 0x1f)
-#define __swp_offset(x)                         ((x).val >> 7)
-#define __swp_entry(type, offset)      ((swp_entry_t)  { ((type) << 2) | 
((offset) << 7) })
+#define __SWP_TYPE_SHIFT       2
+
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { (pte).pte_high 
})
 #define __swp_entry_to_pte(x)          ((pte_t) { 0, (x).val })
 
@@ -235,9 +232,8 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t 
prot)
  *      _PAGE_GLOBAL at bit 6
  *      _PAGE_VALID at bit 7
  */
-#define __swp_type(x)                  (((x).val >> 8) & 0x1f)
-#define __swp_offset(x)                         ((x).val >> 13)
-#define __swp_entry(type,offset)       ((swp_entry_t)  { ((type) << 8) | 
((offset) << 13) })
+#define __SWP_TYPE_SHIFT       8
+
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
@@ -245,4 +241,16 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t 
prot)
 
 #endif /* defined(CONFIG_CPU_R3K_TLB) */
 
+#define __SWP_TYPE_BITS                5
+#define __SWP_TYPE_MASK                ((1UL << __SWP_TYPE_BITS) - 1)
+#define __SWP_OFFSET_SHIFT     (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
+
+#define MAX_SWAPFILES_CHECK()  \
+       BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
+
+#define __swp_type(x)                  (((x).val >> __SWP_TYPE_SHIFT) & 
__SWP_TYPE_MASK)
+#define __swp_offset(x)                        ((x).val >> __SWP_OFFSET_SHIFT)
+#define __swp_entry(type,offset)       ((swp_entry_t) { ((type) << 
__SWP_TYPE_SHIFT) | \
+                                               ((offset) << 
__SWP_OFFSET_SHIFT) })
+
 #endif /* _ASM_PGTABLE_32_H */
diff --git a/arch/mips/include/asm/pgtable-64.h 
b/arch/mips/include/asm/pgtable-64.h
index 1e7d6ce..d064444 100644
--- a/arch/mips/include/asm/pgtable-64.h
+++ b/arch/mips/include/asm/pgtable-64.h
@@ -330,15 +330,27 @@ extern void pgd_init(unsigned long page);
 extern void pud_init(unsigned long page, unsigned long pagetable);
 extern void pmd_init(unsigned long page, unsigned long pagetable);
 
+#define __SWP_TYPE_SHIFT       16
+#define __SWP_TYPE_BITS                8
+#define __SWP_TYPE_MASK                ((1UL << __SWP_TYPE_BITS) - 1)
+#define __SWP_OFFSET_SHIFT     (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
+
+#define MAX_SWAPFILES_CHECK()  \
+       BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
+
 /*
  * Non-present pages:  high 40 bits are offset, next 8 bits type,
  * low 16 bits zero.
  */
 static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
-{ pte_t pte; pte_val(pte) = (type << 16) | (offset << 24); return pte; }
+{
+       pte_t pte;
+       pte_val(pte) = (type << __SWP_TYPE_SHIFT) | (offset << 
__SWP_OFFSET_SHIFT);
+       return pte;
+}
 
-#define __swp_type(x)          (((x).val >> 16) & 0xff)
-#define __swp_offset(x)                ((x).val >> 24)
+#define __swp_type(x)          (((x).val >> __SWP_TYPE_SHIFT) & 
__SWP_TYPE_MASK)
+#define __swp_offset(x)                ((x).val >> __SWP_OFFSET_SHIFT)
 #define __swp_entry(type, offset) ((swp_entry_t) { pte_val(mk_swap_pte((type), 
(offset))) })
 #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
-- 
2.1.0

Reply via email to