pgtable.h (d0b8883800c913f5cc0eb273c052bcac94ad44d8) pgtable.h (106c992a5ebef28193cf5958e49ceff5e4aebb04)
1/*
2 * S390 version
3 * Copyright IBM Corp. 1999, 2000
4 * Author(s): Hartmut Penner (hp@de.ibm.com)
5 * Ulrich Weigand (weigand@de.ibm.com)
6 * Martin Schwidefsky (schwidefsky@de.ibm.com)
7 *
8 * Derived from "include/asm-i386/pgtable.h"

--- 410 unchanged lines hidden (view full) ---

419#define __S001 PAGE_RO
420#define __S010 PAGE_RW
421#define __S011 PAGE_RW
422#define __S100 PAGE_RO
423#define __S101 PAGE_RO
424#define __S110 PAGE_RW
425#define __S111 PAGE_RW
426
1/*
2 * S390 version
3 * Copyright IBM Corp. 1999, 2000
4 * Author(s): Hartmut Penner (hp@de.ibm.com)
5 * Ulrich Weigand (weigand@de.ibm.com)
6 * Martin Schwidefsky (schwidefsky@de.ibm.com)
7 *
8 * Derived from "include/asm-i386/pgtable.h"

--- 410 unchanged lines hidden (view full) ---

419#define __S001 PAGE_RO
420#define __S010 PAGE_RW
421#define __S011 PAGE_RW
422#define __S100 PAGE_RO
423#define __S101 PAGE_RO
424#define __S110 PAGE_RW
425#define __S111 PAGE_RW
426
427/*
428 * Segment entry (large page) protection definitions.
429 */
430#define SEGMENT_NONE __pgprot(_HPAGE_TYPE_NONE)
431#define SEGMENT_RO __pgprot(_HPAGE_TYPE_RO)
432#define SEGMENT_RW __pgprot(_HPAGE_TYPE_RW)
433
427static inline int mm_exclusive(struct mm_struct *mm)
428{
429 return likely(mm == current->active_mm &&
430 atomic_read(&mm->context.attach_count) <= 1);
431}
432
433static inline int mm_has_pgste(struct mm_struct *mm)
434{

--- 474 unchanged lines hidden (view full) ---

909{
910 pte_val(pte) |= _PAGE_SPECIAL;
911 return pte;
912}
913
914#ifdef CONFIG_HUGETLB_PAGE
915static inline pte_t pte_mkhuge(pte_t pte)
916{
434static inline int mm_exclusive(struct mm_struct *mm)
435{
436 return likely(mm == current->active_mm &&
437 atomic_read(&mm->context.attach_count) <= 1);
438}
439
440static inline int mm_has_pgste(struct mm_struct *mm)
441{

--- 474 unchanged lines hidden (view full) ---

916{
917 pte_val(pte) |= _PAGE_SPECIAL;
918 return pte;
919}
920
921#ifdef CONFIG_HUGETLB_PAGE
922static inline pte_t pte_mkhuge(pte_t pte)
923{
917 /*
918 * PROT_NONE needs to be remapped from the pte type to the ste type.
919 * The HW invalid bit is also different for pte and ste. The pte
920 * invalid bit happens to be the same as the ste _SEGMENT_ENTRY_LARGE
921 * bit, so we don't have to clear it.
922 */
923 if (pte_val(pte) & _PAGE_INVALID) {
924 if (pte_val(pte) & _PAGE_SWT)
925 pte_val(pte) |= _HPAGE_TYPE_NONE;
926 pte_val(pte) |= _SEGMENT_ENTRY_INV;
927 }
928 /*
929 * Clear SW pte bits, there are no SW bits in a segment table entry.
930 */
931 pte_val(pte) &= ~(_PAGE_SWT | _PAGE_SWX | _PAGE_SWC |
932 _PAGE_SWR | _PAGE_SWW);
933 /*
934 * Also set the change-override bit because we don't need dirty bit
935 * tracking for hugetlbfs pages.
936 */
937 pte_val(pte) |= (_SEGMENT_ENTRY_LARGE | _SEGMENT_ENTRY_CO);
938 return pte;
939}
940#endif
941
942/*
943 * Get (and clear) the user dirty bit for a pte.
944 */

--- 328 unchanged lines hidden (view full) ---

1273 : "=m" (*pmdp)
1274 : "m" (*pmdp), "a" (sto),
1275 "a" ((address & HPAGE_MASK))
1276 : "cc"
1277 );
1278 }
1279}
1280
924 pte_val(pte) |= (_SEGMENT_ENTRY_LARGE | _SEGMENT_ENTRY_CO);
925 return pte;
926}
927#endif
928
929/*
930 * Get (and clear) the user dirty bit for a pte.
931 */

--- 328 unchanged lines hidden (view full) ---

1260 : "=m" (*pmdp)
1261 : "m" (*pmdp), "a" (sto),
1262 "a" ((address & HPAGE_MASK))
1263 : "cc"
1264 );
1265 }
1266}
1267
1281#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1282
1283#define SEGMENT_NONE __pgprot(_HPAGE_TYPE_NONE)
1284#define SEGMENT_RO __pgprot(_HPAGE_TYPE_RO)
1285#define SEGMENT_RW __pgprot(_HPAGE_TYPE_RW)
1286
1287#define __HAVE_ARCH_PGTABLE_DEPOSIT
1288extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pgtable_t pgtable);
1289
1290#define __HAVE_ARCH_PGTABLE_WITHDRAW
1291extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm);
1292
1293static inline int pmd_trans_splitting(pmd_t pmd)
1294{
1295 return pmd_val(pmd) & _SEGMENT_ENTRY_SPLIT;
1296}
1297
1298static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
1299 pmd_t *pmdp, pmd_t entry)
1300{
1301 if (!(pmd_val(entry) & _SEGMENT_ENTRY_INV) && MACHINE_HAS_EDAT1)
1302 pmd_val(entry) |= _SEGMENT_ENTRY_CO;
1303 *pmdp = entry;
1304}
1305
1268#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLB_PAGE)
1306static inline unsigned long massage_pgprot_pmd(pgprot_t pgprot)
1307{
1308 /*
1309 * pgprot is PAGE_NONE, PAGE_RO, or PAGE_RW (see __Pxxx / __Sxxx)
1310 * Convert to segment table entry format.
1311 */
1312 if (pgprot_val(pgprot) == pgprot_val(PAGE_NONE))
1313 return pgprot_val(SEGMENT_NONE);

--- 4 unchanged lines hidden (view full) ---

1318
1319static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
1320{
1321 pmd_val(pmd) &= _SEGMENT_CHG_MASK;
1322 pmd_val(pmd) |= massage_pgprot_pmd(newprot);
1323 return pmd;
1324}
1325
1269static inline unsigned long massage_pgprot_pmd(pgprot_t pgprot)
1270{
1271 /*
1272 * pgprot is PAGE_NONE, PAGE_RO, or PAGE_RW (see __Pxxx / __Sxxx)
1273 * Convert to segment table entry format.
1274 */
1275 if (pgprot_val(pgprot) == pgprot_val(PAGE_NONE))
1276 return pgprot_val(SEGMENT_NONE);

--- 4 unchanged lines hidden (view full) ---

1281
1282static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
1283{
1284 pmd_val(pmd) &= _SEGMENT_CHG_MASK;
1285 pmd_val(pmd) |= massage_pgprot_pmd(newprot);
1286 return pmd;
1287}
1288
1326static inline pmd_t pmd_mkhuge(pmd_t pmd)
1289static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
1327{
1290{
1328 pmd_val(pmd) |= _SEGMENT_ENTRY_LARGE;
1329 return pmd;
1291 pmd_t __pmd;
1292 pmd_val(__pmd) = physpage + massage_pgprot_pmd(pgprot);
1293 return __pmd;
1330}
1331
1332static inline pmd_t pmd_mkwrite(pmd_t pmd)
1333{
1334 /* Do not clobber _HPAGE_TYPE_NONE pages! */
1335 if (!(pmd_val(pmd) & _SEGMENT_ENTRY_INV))
1336 pmd_val(pmd) &= ~_SEGMENT_ENTRY_RO;
1337 return pmd;
1338}
1294}
1295
1296static inline pmd_t pmd_mkwrite(pmd_t pmd)
1297{
1298 /* Do not clobber _HPAGE_TYPE_NONE pages! */
1299 if (!(pmd_val(pmd) & _SEGMENT_ENTRY_INV))
1300 pmd_val(pmd) &= ~_SEGMENT_ENTRY_RO;
1301 return pmd;
1302}
1303#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLB_PAGE */
1339
1304
1305#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1306
1307#define __HAVE_ARCH_PGTABLE_DEPOSIT
1308extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pgtable_t pgtable);
1309
1310#define __HAVE_ARCH_PGTABLE_WITHDRAW
1311extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm);
1312
1313static inline int pmd_trans_splitting(pmd_t pmd)
1314{
1315 return pmd_val(pmd) & _SEGMENT_ENTRY_SPLIT;
1316}
1317
1318static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
1319 pmd_t *pmdp, pmd_t entry)
1320{
1321 if (!(pmd_val(entry) & _SEGMENT_ENTRY_INV) && MACHINE_HAS_EDAT1)
1322 pmd_val(entry) |= _SEGMENT_ENTRY_CO;
1323 *pmdp = entry;
1324}
1325
1326static inline pmd_t pmd_mkhuge(pmd_t pmd)
1327{
1328 pmd_val(pmd) |= _SEGMENT_ENTRY_LARGE;
1329 return pmd;
1330}
1331
1340static inline pmd_t pmd_wrprotect(pmd_t pmd)
1341{
1342 pmd_val(pmd) |= _SEGMENT_ENTRY_RO;
1343 return pmd;
1344}
1345
1346static inline pmd_t pmd_mkdirty(pmd_t pmd)
1347{

--- 79 unchanged lines hidden (view full) ---

1427 pmd_t pmd = *pmdp;
1428
1429 if (pmd_write(pmd)) {
1430 __pmd_idte(address, pmdp);
1431 set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd));
1432 }
1433}
1434
1332static inline pmd_t pmd_wrprotect(pmd_t pmd)
1333{
1334 pmd_val(pmd) |= _SEGMENT_ENTRY_RO;
1335 return pmd;
1336}
1337
1338static inline pmd_t pmd_mkdirty(pmd_t pmd)
1339{

--- 79 unchanged lines hidden (view full) ---

1419 pmd_t pmd = *pmdp;
1420
1421 if (pmd_write(pmd)) {
1422 __pmd_idte(address, pmdp);
1423 set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd));
1424 }
1425}
1426
1435static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
1436{
1437 pmd_t __pmd;
1438 pmd_val(__pmd) = physpage + massage_pgprot_pmd(pgprot);
1439 return __pmd;
1440}
1441
1442#define pfn_pmd(pfn, pgprot) mk_pmd_phys(__pa((pfn) << PAGE_SHIFT), (pgprot))
1443#define mk_pmd(page, pgprot) pfn_pmd(page_to_pfn(page), (pgprot))
1444
1445static inline int pmd_trans_huge(pmd_t pmd)
1446{
1447 return pmd_val(pmd) & _SEGMENT_ENTRY_LARGE;
1448}
1449

--- 97 unchanged lines hidden ---
1427#define pfn_pmd(pfn, pgprot) mk_pmd_phys(__pa((pfn) << PAGE_SHIFT), (pgprot))
1428#define mk_pmd(page, pgprot) pfn_pmd(page_to_pfn(page), (pgprot))
1429
1430static inline int pmd_trans_huge(pmd_t pmd)
1431{
1432 return pmd_val(pmd) & _SEGMENT_ENTRY_LARGE;
1433}
1434

--- 97 unchanged lines hidden ---