5
5
6
6
#include <linux/memory_hotplug.h>
7
7
#include <linux/memblock.h>
8
- #include <linux/kasan.h>
9
8
#include <linux/pfn.h>
10
9
#include <linux/mm.h>
11
10
#include <linux/init.h>
@@ -650,108 +649,8 @@ void vmem_unmap_4k_page(unsigned long addr)
650
649
mutex_unlock (& vmem_mutex );
651
650
}
652
651
653
- static int __init memblock_region_cmp (const void * a , const void * b )
654
- {
655
- const struct memblock_region * r1 = a ;
656
- const struct memblock_region * r2 = b ;
657
-
658
- if (r1 -> base < r2 -> base )
659
- return -1 ;
660
- if (r1 -> base > r2 -> base )
661
- return 1 ;
662
- return 0 ;
663
- }
664
-
665
- static void __init memblock_region_swap (void * a , void * b , int size )
666
- {
667
- swap (* (struct memblock_region * )a , * (struct memblock_region * )b );
668
- }
669
-
670
- #ifdef CONFIG_KASAN
671
- #define __sha (x ) ((unsigned long)kasan_mem_to_shadow((void *)x))
672
-
673
- static inline int set_memory_kasan (unsigned long start , unsigned long end )
674
- {
675
- start = PAGE_ALIGN_DOWN (__sha (start ));
676
- end = PAGE_ALIGN (__sha (end ));
677
- return set_memory_rwnx (start , (end - start ) >> PAGE_SHIFT );
678
- }
679
- #endif
680
-
681
- /*
682
- * map whole physical memory to virtual memory (identity mapping)
683
- * we reserve enough space in the vmalloc area for vmemmap to hotplug
684
- * additional memory segments.
685
- */
686
652
void __init vmem_map_init (void )
687
653
{
688
- struct memblock_region memory_rwx_regions [] = {
689
- {
690
- .base = 0 ,
691
- .size = sizeof (struct lowcore ),
692
- .flags = MEMBLOCK_NONE ,
693
- #ifdef CONFIG_NUMA
694
- .nid = NUMA_NO_NODE ,
695
- #endif
696
- },
697
- {
698
- .base = __pa (_stext ),
699
- .size = _etext - _stext ,
700
- .flags = MEMBLOCK_NONE ,
701
- #ifdef CONFIG_NUMA
702
- .nid = NUMA_NO_NODE ,
703
- #endif
704
- },
705
- {
706
- .base = __pa (_sinittext ),
707
- .size = _einittext - _sinittext ,
708
- .flags = MEMBLOCK_NONE ,
709
- #ifdef CONFIG_NUMA
710
- .nid = NUMA_NO_NODE ,
711
- #endif
712
- },
713
- {
714
- .base = __stext_amode31 ,
715
- .size = __etext_amode31 - __stext_amode31 ,
716
- .flags = MEMBLOCK_NONE ,
717
- #ifdef CONFIG_NUMA
718
- .nid = NUMA_NO_NODE ,
719
- #endif
720
- },
721
- };
722
- struct memblock_type memory_rwx = {
723
- .regions = memory_rwx_regions ,
724
- .cnt = ARRAY_SIZE (memory_rwx_regions ),
725
- .max = ARRAY_SIZE (memory_rwx_regions ),
726
- };
727
- phys_addr_t base , end ;
728
- u64 i ;
729
-
730
- /*
731
- * Set RW+NX attribute on all memory, except regions enumerated with
732
- * memory_rwx exclude type. These regions need different attributes,
733
- * which are enforced afterwards.
734
- *
735
- * __for_each_mem_range() iterate and exclude types should be sorted.
736
- * The relative location of _stext and _sinittext is hardcoded in the
737
- * linker script. However a location of __stext_amode31 and the kernel
738
- * image itself are chosen dynamically. Thus, sort the exclude type.
739
- */
740
- sort (& memory_rwx_regions ,
741
- ARRAY_SIZE (memory_rwx_regions ), sizeof (memory_rwx_regions [0 ]),
742
- memblock_region_cmp , memblock_region_swap );
743
- __for_each_mem_range (i , & memblock .memory , & memory_rwx ,
744
- NUMA_NO_NODE , MEMBLOCK_NONE , & base , & end , NULL ) {
745
- set_memory_rwnx ((unsigned long )__va (base ),
746
- (end - base ) >> PAGE_SHIFT );
747
- }
748
-
749
- #ifdef CONFIG_KASAN
750
- for_each_mem_range (i , & base , & end ) {
751
- set_memory_kasan ((unsigned long )__va (base ),
752
- (unsigned long )__va (end ));
753
- }
754
- #endif
755
654
set_memory_rox ((unsigned long )_stext ,
756
655
(unsigned long )(_etext - _stext ) >> PAGE_SHIFT );
757
656
set_memory_ro ((unsigned long )_etext ,
@@ -762,14 +661,14 @@ void __init vmem_map_init(void)
762
661
(__etext_amode31 - __stext_amode31 ) >> PAGE_SHIFT );
763
662
764
663
/* lowcore must be executable for LPSWE */
765
- if (static_key_enabled (& cpu_has_bear ))
766
- set_memory_nx (0 , 1 );
767
- set_memory_nx (PAGE_SIZE , 1 );
664
+ if (!static_key_enabled (& cpu_has_bear ))
665
+ set_memory_x (0 , 1 );
768
666
if (debug_pagealloc_enabled ()) {
769
667
set_memory_4k ((unsigned long )__va (0 ),
770
668
ident_map_size >> PAGE_SHIFT );
771
669
}
772
-
670
+ if (MACHINE_HAS_NX )
671
+ ctl_set_bit (0 , 20 );
773
672
pr_info ("Write protected kernel read-only data: %luk\n" ,
774
673
(unsigned long )(__end_rodata - _stext ) >> 10 );
775
674
}
0 commit comments