|
@@ -572,8 +572,9 @@ void __init mem_init(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_ARM_KERNMEM_PERMS
|
|
|
+#ifdef CONFIG_DEBUG_RODATA
|
|
|
struct section_perm {
|
|
|
+ const char *name;
|
|
|
unsigned long start;
|
|
|
unsigned long end;
|
|
|
pmdval_t mask;
|
|
@@ -584,6 +585,7 @@ struct section_perm {
|
|
|
static struct section_perm nx_perms[] = {
|
|
|
/* Make pages tables, etc before _stext RW (set NX). */
|
|
|
{
|
|
|
+ .name = "pre-text NX",
|
|
|
.start = PAGE_OFFSET,
|
|
|
.end = (unsigned long)_stext,
|
|
|
.mask = ~PMD_SECT_XN,
|
|
@@ -591,14 +593,16 @@ static struct section_perm nx_perms[] = {
|
|
|
},
|
|
|
/* Make init RW (set NX). */
|
|
|
{
|
|
|
+ .name = "init NX",
|
|
|
.start = (unsigned long)__init_begin,
|
|
|
.end = (unsigned long)_sdata,
|
|
|
.mask = ~PMD_SECT_XN,
|
|
|
.prot = PMD_SECT_XN,
|
|
|
},
|
|
|
-#ifdef CONFIG_DEBUG_RODATA
|
|
|
+#ifdef CONFIG_DEBUG_ALIGN_RODATA
|
|
|
/* Make rodata NX (set RO in ro_perms below). */
|
|
|
{
|
|
|
+ .name = "rodata NX",
|
|
|
.start = (unsigned long)__start_rodata,
|
|
|
.end = (unsigned long)__init_begin,
|
|
|
.mask = ~PMD_SECT_XN,
|
|
@@ -607,10 +611,10 @@ static struct section_perm nx_perms[] = {
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
-#ifdef CONFIG_DEBUG_RODATA
|
|
|
static struct section_perm ro_perms[] = {
|
|
|
/* Make kernel code and rodata RX (set RO). */
|
|
|
{
|
|
|
+ .name = "text/rodata RO",
|
|
|
.start = (unsigned long)_stext,
|
|
|
.end = (unsigned long)__init_begin,
|
|
|
#ifdef CONFIG_ARM_LPAE
|
|
@@ -623,7 +627,6 @@ static struct section_perm ro_perms[] = {
|
|
|
#endif
|
|
|
},
|
|
|
};
|
|
|
-#endif
|
|
|
|
|
|
/*
|
|
|
* Updates section permissions only for the current mm (sections are
|
|
@@ -670,8 +673,8 @@ void set_section_perms(struct section_perm *perms, int n, bool set,
|
|
|
for (i = 0; i < n; i++) {
|
|
|
if (!IS_ALIGNED(perms[i].start, SECTION_SIZE) ||
|
|
|
!IS_ALIGNED(perms[i].end, SECTION_SIZE)) {
|
|
|
- pr_err("BUG: section %lx-%lx not aligned to %lx\n",
|
|
|
- perms[i].start, perms[i].end,
|
|
|
+ pr_err("BUG: %s section %lx-%lx not aligned to %lx\n",
|
|
|
+ perms[i].name, perms[i].start, perms[i].end,
|
|
|
SECTION_SIZE);
|
|
|
continue;
|
|
|
}
|
|
@@ -712,7 +715,6 @@ void fix_kernmem_perms(void)
|
|
|
stop_machine(__fix_kernmem_perms, NULL, NULL);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_DEBUG_RODATA
|
|
|
int __mark_rodata_ro(void *unused)
|
|
|
{
|
|
|
update_sections_early(ro_perms, ARRAY_SIZE(ro_perms));
|
|
@@ -735,11 +737,10 @@ void set_kernel_text_ro(void)
|
|
|
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true,
|
|
|
current->active_mm);
|
|
|
}
|
|
|
-#endif /* CONFIG_DEBUG_RODATA */
|
|
|
|
|
|
#else
|
|
|
static inline void fix_kernmem_perms(void) { }
|
|
|
-#endif /* CONFIG_ARM_KERNMEM_PERMS */
|
|
|
+#endif /* CONFIG_DEBUG_RODATA */
|
|
|
|
|
|
void free_tcmmem(void)
|
|
|
{
|