1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2015 Rusty Russell
8 #include <linux/module.h>
10 #include <linux/vmalloc.h>
11 #include <linux/set_memory.h>
14 static int module_set_memory(const struct module
*mod
, enum mod_mem_type type
,
15 int (*set_memory
)(unsigned long start
, int num_pages
))
17 const struct module_memory
*mod_mem
= &mod
->mem
[type
];
22 set_vm_flush_reset_perms(mod_mem
->base
);
23 return set_memory((unsigned long)mod_mem
->base
, mod_mem
->size
>> PAGE_SHIFT
);
27 * Since some arches are moving towards PAGE_KERNEL module allocations instead
28 * of PAGE_KERNEL_EXEC, keep module_enable_x() independent of
29 * CONFIG_STRICT_MODULE_RWX because they are needed regardless of whether we
32 int module_enable_text_rox(const struct module
*mod
)
34 for_class_mod_mem_type(type
, text
) {
37 if (mod
->mem
[type
].is_rox
)
40 if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX
))
41 ret
= module_set_memory(mod
, type
, set_memory_rox
);
43 ret
= module_set_memory(mod
, type
, set_memory_x
);
50 int module_enable_rodata_ro(const struct module
*mod
, bool after_init
)
54 if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX
) || !rodata_enabled
)
57 ret
= module_set_memory(mod
, MOD_RODATA
, set_memory_ro
);
60 ret
= module_set_memory(mod
, MOD_INIT_RODATA
, set_memory_ro
);
65 return module_set_memory(mod
, MOD_RO_AFTER_INIT
, set_memory_ro
);
70 int module_enable_data_nx(const struct module
*mod
)
72 if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX
))
75 for_class_mod_mem_type(type
, data
) {
76 int ret
= module_set_memory(mod
, type
, set_memory_nx
);
84 int module_enforce_rwx_sections(Elf_Ehdr
*hdr
, Elf_Shdr
*sechdrs
,
85 char *secstrings
, struct module
*mod
)
87 const unsigned long shf_wx
= SHF_WRITE
| SHF_EXECINSTR
;
90 if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX
))
93 for (i
= 0; i
< hdr
->e_shnum
; i
++) {
94 if ((sechdrs
[i
].sh_flags
& shf_wx
) == shf_wx
) {
95 pr_err("%s: section %s (index %d) has invalid WRITE|EXEC flags\n",
96 mod
->name
, secstrings
+ sechdrs
[i
].sh_name
, i
);