@@ -124,6 +124,8 @@ static inline int is_module_addr(void *addr)
124124#define KASLR_LEN 0UL
125125#endif
126126
127+ void setup_protection_map (void );
128+
127129/*
128130 * A 64 bit pagetable entry of S390 has following format:
129131 * | PFRA |0IPC| OS |
@@ -442,76 +444,107 @@ static inline int is_module_addr(void *addr)
442444/*
443445 * Page protection definitions.
444446 */
445- #define PAGE_NONE __pgprot (_PAGE_PRESENT | _PAGE_INVALID | _PAGE_PROTECT)
446- #define PAGE_RO __pgprot (_PAGE_PRESENT | _PAGE_READ | \
447+ #define __PAGE_NONE (_PAGE_PRESENT | _PAGE_INVALID | _PAGE_PROTECT)
448+ #define __PAGE_RO (_PAGE_PRESENT | _PAGE_READ | \
447449 _PAGE_NOEXEC | _PAGE_INVALID | _PAGE_PROTECT)
448- #define PAGE_RX __pgprot (_PAGE_PRESENT | _PAGE_READ | \
450+ #define __PAGE_RX (_PAGE_PRESENT | _PAGE_READ | \
449451 _PAGE_INVALID | _PAGE_PROTECT)
450- #define PAGE_RW __pgprot (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
452+ #define __PAGE_RW (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
451453 _PAGE_NOEXEC | _PAGE_INVALID | _PAGE_PROTECT)
452- #define PAGE_RWX __pgprot (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
454+ #define __PAGE_RWX (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
453455 _PAGE_INVALID | _PAGE_PROTECT)
454-
455- #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
456+ #define __PAGE_SHARED (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
456457 _PAGE_YOUNG | _PAGE_DIRTY | _PAGE_NOEXEC)
457- #define PAGE_KERNEL __pgprot (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
458+ #define __PAGE_KERNEL (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
458459 _PAGE_YOUNG | _PAGE_DIRTY | _PAGE_NOEXEC)
459- #define PAGE_KERNEL_RO __pgprot (_PAGE_PRESENT | _PAGE_READ | _PAGE_YOUNG | \
460+ #define __PAGE_KERNEL_RO (_PAGE_PRESENT | _PAGE_READ | _PAGE_YOUNG | \
460461 _PAGE_PROTECT | _PAGE_NOEXEC)
461462
463+ extern unsigned long page_noexec_mask ;
464+
465+ #define __pgprot_page_mask (x ) __pgprot((x) & page_noexec_mask)
466+
467+ #define PAGE_NONE __pgprot_page_mask(__PAGE_NONE)
468+ #define PAGE_RO __pgprot_page_mask(__PAGE_RO)
469+ #define PAGE_RX __pgprot_page_mask(__PAGE_RX)
470+ #define PAGE_RW __pgprot_page_mask(__PAGE_RW)
471+ #define PAGE_RWX __pgprot_page_mask(__PAGE_RWX)
472+ #define PAGE_SHARED __pgprot_page_mask(__PAGE_SHARED)
473+ #define PAGE_KERNEL __pgprot_page_mask(__PAGE_KERNEL)
474+ #define PAGE_KERNEL_RO __pgprot_page_mask(__PAGE_KERNEL_RO)
475+
462476/*
463477 * Segment entry (large page) protection definitions.
464478 */
465- #define SEGMENT_NONE __pgprot (_SEGMENT_ENTRY_PRESENT | \
479+ #define __SEGMENT_NONE (_SEGMENT_ENTRY_PRESENT | \
466480 _SEGMENT_ENTRY_INVALID | \
467481 _SEGMENT_ENTRY_PROTECT)
468- #define SEGMENT_RO __pgprot (_SEGMENT_ENTRY_PRESENT | \
482+ #define __SEGMENT_RO (_SEGMENT_ENTRY_PRESENT | \
469483 _SEGMENT_ENTRY_PROTECT | \
470484 _SEGMENT_ENTRY_READ | \
471485 _SEGMENT_ENTRY_NOEXEC)
472- #define SEGMENT_RX __pgprot (_SEGMENT_ENTRY_PRESENT | \
486+ #define __SEGMENT_RX (_SEGMENT_ENTRY_PRESENT | \
473487 _SEGMENT_ENTRY_PROTECT | \
474488 _SEGMENT_ENTRY_READ)
475- #define SEGMENT_RW __pgprot (_SEGMENT_ENTRY_PRESENT | \
489+ #define __SEGMENT_RW (_SEGMENT_ENTRY_PRESENT | \
476490 _SEGMENT_ENTRY_READ | \
477491 _SEGMENT_ENTRY_WRITE | \
478492 _SEGMENT_ENTRY_NOEXEC)
479- #define SEGMENT_RWX __pgprot (_SEGMENT_ENTRY_PRESENT | \
493+ #define __SEGMENT_RWX (_SEGMENT_ENTRY_PRESENT | \
480494 _SEGMENT_ENTRY_READ | \
481495 _SEGMENT_ENTRY_WRITE)
482- #define SEGMENT_KERNEL __pgprot (_SEGMENT_ENTRY | \
496+ #define __SEGMENT_KERNEL (_SEGMENT_ENTRY | \
483497 _SEGMENT_ENTRY_LARGE | \
484498 _SEGMENT_ENTRY_READ | \
485499 _SEGMENT_ENTRY_WRITE | \
486500 _SEGMENT_ENTRY_YOUNG | \
487501 _SEGMENT_ENTRY_DIRTY | \
488502 _SEGMENT_ENTRY_NOEXEC)
489- #define SEGMENT_KERNEL_RO __pgprot (_SEGMENT_ENTRY | \
503+ #define __SEGMENT_KERNEL_RO (_SEGMENT_ENTRY | \
490504 _SEGMENT_ENTRY_LARGE | \
491505 _SEGMENT_ENTRY_READ | \
492506 _SEGMENT_ENTRY_YOUNG | \
493507 _SEGMENT_ENTRY_PROTECT | \
494508 _SEGMENT_ENTRY_NOEXEC)
495509
510+ extern unsigned long segment_noexec_mask ;
511+
512+ #define __pgprot_segment_mask (x ) __pgprot((x) & segment_noexec_mask)
513+
514+ #define SEGMENT_NONE __pgprot_segment_mask(__SEGMENT_NONE)
515+ #define SEGMENT_RO __pgprot_segment_mask(__SEGMENT_RO)
516+ #define SEGMENT_RX __pgprot_segment_mask(__SEGMENT_RX)
517+ #define SEGMENT_RW __pgprot_segment_mask(__SEGMENT_RW)
518+ #define SEGMENT_RWX __pgprot_segment_mask(__SEGMENT_RWX)
519+ #define SEGMENT_KERNEL __pgprot_segment_mask(__SEGMENT_KERNEL)
520+ #define SEGMENT_KERNEL_RO __pgprot_segment_mask(__SEGMENT_KERNEL_RO)
521+
496522/*
497523 * Region3 entry (large page) protection definitions.
498524 */
499525
500- #define REGION3_KERNEL __pgprot (_REGION_ENTRY_TYPE_R3 | \
526+ #define __REGION3_KERNEL (_REGION_ENTRY_TYPE_R3 | \
501527 _REGION3_ENTRY_PRESENT | \
502- _REGION3_ENTRY_LARGE | \
503- _REGION3_ENTRY_READ | \
504- _REGION3_ENTRY_WRITE | \
505- _REGION3_ENTRY_YOUNG | \
528+ _REGION3_ENTRY_LARGE | \
529+ _REGION3_ENTRY_READ | \
530+ _REGION3_ENTRY_WRITE | \
531+ _REGION3_ENTRY_YOUNG | \
506532 _REGION3_ENTRY_DIRTY | \
507533 _REGION_ENTRY_NOEXEC)
508- #define REGION3_KERNEL_RO __pgprot(_REGION_ENTRY_TYPE_R3 | \
509- _REGION3_ENTRY_PRESENT | \
510- _REGION3_ENTRY_LARGE | \
511- _REGION3_ENTRY_READ | \
512- _REGION3_ENTRY_YOUNG | \
513- _REGION_ENTRY_PROTECT | \
514- _REGION_ENTRY_NOEXEC)
534+ #define __REGION3_KERNEL_RO (_REGION_ENTRY_TYPE_R3 | \
535+ _REGION3_ENTRY_PRESENT | \
536+ _REGION3_ENTRY_LARGE | \
537+ _REGION3_ENTRY_READ | \
538+ _REGION3_ENTRY_YOUNG | \
539+ _REGION_ENTRY_PROTECT | \
540+ _REGION_ENTRY_NOEXEC)
541+
542+ extern unsigned long region_noexec_mask ;
543+
544+ #define __pgprot_region_mask (x ) __pgprot((x) & region_noexec_mask)
545+
546+ #define REGION3_KERNEL __pgprot_region_mask(__REGION3_KERNEL)
547+ #define REGION3_KERNEL_RO __pgprot_region_mask(__REGION3_KERNEL_RO)
515548
516549static inline bool mm_p4d_folded (struct mm_struct * mm )
517550{
@@ -1412,8 +1445,6 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
14121445 pte_t __pte ;
14131446
14141447 __pte = __pte (physpage | pgprot_val (pgprot ));
1415- if (!MACHINE_HAS_NX )
1416- __pte = clear_pte_bit (__pte , __pgprot (_PAGE_NOEXEC ));
14171448 return pte_mkyoung (__pte );
14181449}
14191450
@@ -1781,8 +1812,6 @@ static inline int pmdp_clear_flush_young(struct vm_area_struct *vma,
17811812static inline void set_pmd_at (struct mm_struct * mm , unsigned long addr ,
17821813 pmd_t * pmdp , pmd_t entry )
17831814{
1784- if (!MACHINE_HAS_NX )
1785- entry = clear_pmd_bit (entry , __pgprot (_SEGMENT_ENTRY_NOEXEC ));
17861815 set_pmd (pmdp , entry );
17871816}
17881817
0 commit comments