@@ -1053,18 +1053,53 @@ unsigned long arch_max_swapfile_size(void)
1053
1053
#ifdef CONFIG_EXECMEM
1054
1054
static struct execmem_info execmem_info __ro_after_init ;
1055
1055
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
+
1056
1067
struct execmem_info __init * execmem_arch_setup (void )
1057
1068
{
1058
1069
unsigned long start , offset = 0 ;
1070
+ enum execmem_range_flags flags ;
1071
+ pgprot_t pgprot ;
1059
1072
1060
1073
if (kaslr_enabled ())
1061
1074
offset = get_random_u32_inclusive (1 , 1024 ) * PAGE_SIZE ;
1062
1075
1063
1076
start = MODULES_VADDR + offset ;
1064
1077
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
+
1065
1086
execmem_info = (struct execmem_info ){
1066
1087
.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 ] = {
1068
1103
.flags = EXECMEM_KASAN_SHADOW ,
1069
1104
.start = start ,
1070
1105
.end = MODULES_END ,
0 commit comments