@@ -1053,18 +1053,53 @@ unsigned long arch_max_swapfile_size(void)
10531053#ifdef CONFIG_EXECMEM
10541054static struct execmem_info execmem_info __ro_after_init ;
10551055
1056+ #ifdef CONFIG_ARCH_HAS_EXECMEM_ROX
1057+ void execmem_fill_trapping_insns (void * ptr , size_t size , bool writeable )
1058+ {
1059+ /* fill memory with INT3 instructions */
1060+ if (writeable )
1061+ memset (ptr , INT3_INSN_OPCODE , size );
1062+ else
1063+ text_poke_set (ptr , INT3_INSN_OPCODE , size );
1064+ }
1065+ #endif
1066+
10561067struct execmem_info __init * execmem_arch_setup (void )
10571068{
10581069 unsigned long start , offset = 0 ;
1070+ enum execmem_range_flags flags ;
1071+ pgprot_t pgprot ;
10591072
10601073 if (kaslr_enabled ())
10611074 offset = get_random_u32_inclusive (1 , 1024 ) * PAGE_SIZE ;
10621075
10631076 start = MODULES_VADDR + offset ;
10641077
1078+ if (IS_ENABLED (CONFIG_ARCH_HAS_EXECMEM_ROX )) {
1079+ pgprot = PAGE_KERNEL_ROX ;
1080+ flags = EXECMEM_KASAN_SHADOW | EXECMEM_ROX_CACHE ;
1081+ } else {
1082+ pgprot = PAGE_KERNEL ;
1083+ flags = EXECMEM_KASAN_SHADOW ;
1084+ }
1085+
10651086 execmem_info = (struct execmem_info ){
10661087 .ranges = {
1067- [EXECMEM_DEFAULT ] = {
1088+ [EXECMEM_MODULE_TEXT ] = {
1089+ .flags = flags ,
1090+ .start = start ,
1091+ .end = MODULES_END ,
1092+ .pgprot = pgprot ,
1093+ .alignment = MODULE_ALIGN ,
1094+ },
1095+ [EXECMEM_KPROBES ... EXECMEM_BPF ] = {
1096+ .flags = EXECMEM_KASAN_SHADOW ,
1097+ .start = start ,
1098+ .end = MODULES_END ,
1099+ .pgprot = PAGE_KERNEL ,
1100+ .alignment = MODULE_ALIGN ,
1101+ },
1102+ [EXECMEM_MODULE_DATA ] = {
10681103 .flags = EXECMEM_KASAN_SHADOW ,
10691104 .start = start ,
10701105 .end = MODULES_END ,
0 commit comments