|
@@ -282,14 +282,16 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
|
|
|
#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \
|
|
|
!defined(CONFIG_DYNAMIC_FTRACE)
|
|
|
/*
|
|
|
- * Kernel text mappings for the large page aligned .rodata section
|
|
|
- * will be read-only. For the kernel identity mappings covering
|
|
|
- * the holes caused by this alignment can be anything.
|
|
|
+ * Once the kernel maps the text as RO (kernel_set_to_readonly is set),
|
|
|
+ * kernel text mappings for the large page aligned text, rodata sections
|
|
|
+ * will be always read-only. For the kernel identity mappings covering
|
|
|
+ * the holes caused by this alignment can be anything that user asks.
|
|
|
*
|
|
|
* This will preserve the large page mappings for kernel text/data
|
|
|
* at no extra cost.
|
|
|
*/
|
|
|
- if (within(address, (unsigned long)_text,
|
|
|
+ if (kernel_set_to_readonly &&
|
|
|
+ within(address, (unsigned long)_text,
|
|
|
(unsigned long)__end_rodata_hpage_align))
|
|
|
pgprot_val(forbidden) |= _PAGE_RW;
|
|
|
#endif
|