* Re: [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection()
2009-10-29 2:46 [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection() Suresh Siddha
@ 2009-10-29 2:05 ` Steven Rostedt
2009-10-29 2:46 ` [patch 2/3] x86_64, ftrace: make ftrace use kernel identity mapping to modify code Suresh Siddha
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Steven Rostedt @ 2009-10-29 2:05 UTC (permalink / raw)
To: Suresh Siddha; +Cc: mingo, hpa, linux-kernel
On Wed, 2009-10-28 at 18:46 -0800, Suresh Siddha wrote:
> plain text document attachment (fix_cpa_check.patch)
> Steven Rostedt reported that we are unconditionally making the
> kernel text mapping as read-only. i.e., if someone does cpa() to the
> kernel text area for setting/clearing any page table attribute, we
> unconditionally clear the read-write attribute for the kernel text mapping
> that is set at compile time.
>
> We should delay (to forbid the write attribute) and enforce only after the
> kernel has mapped the text as read-only.
>
> Reported-by: Steven Rostedt <rostedt@goodmis.org>
> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Heh, I wrote an almost identical patch myself. It would have been exact,
but I did not make the comment change ;-)
Acked-by: Steven Rostedt <rostedt@goodmis.org>
-- Steve
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro
2009-10-29 2:46 ` [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro Suresh Siddha
@ 2009-10-29 2:06 ` Steven Rostedt
2009-10-30 19:17 ` Suresh Siddha
2009-11-02 18:55 ` [tip:x86/mm] x86_64, cpa: Use " tip-bot for Suresh Siddha
1 sibling, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2009-10-29 2:06 UTC (permalink / raw)
To: Suresh Siddha; +Cc: mingo, hpa, linux-kernel
On Wed, 2009-10-28 at 18:46 -0800, Suresh Siddha wrote:
> plain text document attachment (fix_kernel_text_ro_rw.patch)
> set_kernel_text_rw()/set_kernel_text_ro() are marking pages starting
> from _text to __start_rodata as RW or RO.
>
> With CONFIG_DEBUG_RODATA, there might be free pages (associated with
> padding the sections to 2MB large page boundary) between text
> and rodata sections that are given back to page allocator. So we should
> use only use the start (__text) and end (__stop___ex_table) of the
> text section in set_kernel_text_rw()/set_kernel_text_ro().
>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
> ---
>
I'll go ahead and test this to make sure it does not bust ftrace with an
allyesconfig.
Thanks,
-- Steve
^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection()
@ 2009-10-29 2:46 Suresh Siddha
2009-10-29 2:05 ` Steven Rostedt
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Suresh Siddha @ 2009-10-29 2:46 UTC (permalink / raw)
To: mingo, hpa, linux-kernel; +Cc: Suresh Siddha, rostedt
[-- Attachment #1: fix_cpa_check.patch --]
[-- Type: text/plain, Size: 3167 bytes --]
Steven Rostedt reported that we are unconditionally making the
kernel text mapping as read-only. i.e., if someone does cpa() to the
kernel text area for setting/clearing any page table attribute, we
unconditionally clear the read-write attribute for the kernel text mapping
that is set at compile time.
We should delay (to forbid the write attribute) and enforce only after the
kernel has mapped the text as read-only.
Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
---
arch/x86/include/asm/cacheflush.h | 1 +
arch/x86/mm/init_32.c | 2 +-
arch/x86/mm/init_64.c | 2 +-
arch/x86/mm/pageattr.c | 10 ++++++----
4 files changed, 9 insertions(+), 6 deletions(-)
Index: tip/arch/x86/include/asm/cacheflush.h
===================================================================
--- tip.orig/arch/x86/include/asm/cacheflush.h
+++ tip/arch/x86/include/asm/cacheflush.h
@@ -176,6 +176,7 @@ void clflush_cache_range(void *addr, uns
#ifdef CONFIG_DEBUG_RODATA
void mark_rodata_ro(void);
extern const int rodata_test_data;
+extern int kernel_set_to_readonly;
void set_kernel_text_rw(void);
void set_kernel_text_ro(void);
#else
Index: tip/arch/x86/mm/init_32.c
===================================================================
--- tip.orig/arch/x86/mm/init_32.c
+++ tip/arch/x86/mm/init_32.c
@@ -997,7 +997,7 @@ static noinline int do_test_wp_bit(void)
const int rodata_test_data = 0xC3;
EXPORT_SYMBOL_GPL(rodata_test_data);
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly;
void set_kernel_text_rw(void)
{
Index: tip/arch/x86/mm/init_64.c
===================================================================
--- tip.orig/arch/x86/mm/init_64.c
+++ tip/arch/x86/mm/init_64.c
@@ -695,7 +695,7 @@ void __init mem_init(void)
const int rodata_test_data = 0xC3;
EXPORT_SYMBOL_GPL(rodata_test_data);
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly;
void set_kernel_text_rw(void)
{
Index: tip/arch/x86/mm/pageattr.c
===================================================================
--- tip.orig/arch/x86/mm/pageattr.c
+++ tip/arch/x86/mm/pageattr.c
@@ -282,14 +282,16 @@ static inline pgprot_t static_protection
#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
^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 2/3] x86_64, ftrace: make ftrace use kernel identity mapping to modify code
2009-10-29 2:46 [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection() Suresh Siddha
2009-10-29 2:05 ` Steven Rostedt
@ 2009-10-29 2:46 ` Suresh Siddha
2009-11-02 18:54 ` [tip:x86/mm] x86_64, ftrace: Make " tip-bot for Suresh Siddha
2009-10-29 2:46 ` [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro Suresh Siddha
2009-11-02 18:54 ` [tip:x86/mm] x86, cpa: Fix kernel text RO checks in static_protection() tip-bot for Suresh Siddha
3 siblings, 1 reply; 10+ messages in thread
From: Suresh Siddha @ 2009-10-29 2:46 UTC (permalink / raw)
To: mingo, hpa, linux-kernel; +Cc: Steven Rostedt, Suresh Siddha
[-- Attachment #1: fix_ftrace_rodata.patch --]
[-- Type: text/plain, Size: 2051 bytes --]
On x86_64, kernel text mappings are mapped read-only with CONFIG_DEBUG_RODATA.
So use the kernel identity mapping instead of the kernel text mapping to modify
the kernel text.
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Tested-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
---
arch/x86/kernel/ftrace.c | 17 +++++++++++++++++
arch/x86/mm/pageattr.c | 3 +--
2 files changed, 18 insertions(+), 2 deletions(-)
Index: tip/arch/x86/kernel/ftrace.c
===================================================================
--- tip.orig/arch/x86/kernel/ftrace.c
+++ tip/arch/x86/kernel/ftrace.c
@@ -189,9 +189,26 @@ static void wait_for_nmi(void)
nmi_wait_count++;
}
+static inline int
+within(unsigned long addr, unsigned long start, unsigned long end)
+{
+ return addr >= start && addr < end;
+}
+
static int
do_ftrace_mod_code(unsigned long ip, void *new_code)
{
+ /*
+ * On x86_64, kernel text mappings are mapped read-only with
+ * CONFIG_DEBUG_RODATA. So we use the kernel identity mapping instead
+ * of the kernel text mapping to modify the kernel text.
+ *
+ * For 32bit kernels, these mappings are same and we can use
+ * kernel identity mapping to modify code.
+ */
+ if (within(ip, (unsigned long)_text, (unsigned long)_etext))
+ ip = (unsigned long)__va(__pa(ip));
+
mod_code_ip = (void *)ip;
mod_code_newcode = new_code;
Index: tip/arch/x86/mm/pageattr.c
===================================================================
--- tip.orig/arch/x86/mm/pageattr.c
+++ tip/arch/x86/mm/pageattr.c
@@ -279,8 +279,7 @@ static inline pgprot_t static_protection
__pa((unsigned long)__end_rodata) >> PAGE_SHIFT))
pgprot_val(forbidden) |= _PAGE_RW;
-#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \
- !defined(CONFIG_DYNAMIC_FTRACE)
+#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)
/*
* 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
^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro
2009-10-29 2:46 [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection() Suresh Siddha
2009-10-29 2:05 ` Steven Rostedt
2009-10-29 2:46 ` [patch 2/3] x86_64, ftrace: make ftrace use kernel identity mapping to modify code Suresh Siddha
@ 2009-10-29 2:46 ` Suresh Siddha
2009-10-29 2:06 ` Steven Rostedt
2009-11-02 18:55 ` [tip:x86/mm] x86_64, cpa: Use " tip-bot for Suresh Siddha
2009-11-02 18:54 ` [tip:x86/mm] x86, cpa: Fix kernel text RO checks in static_protection() tip-bot for Suresh Siddha
3 siblings, 2 replies; 10+ messages in thread
From: Suresh Siddha @ 2009-10-29 2:46 UTC (permalink / raw)
To: mingo, hpa, linux-kernel; +Cc: Steven Rostedt, Suresh Siddha
[-- Attachment #1: fix_kernel_text_ro_rw.patch --]
[-- Type: text/plain, Size: 1900 bytes --]
set_kernel_text_rw()/set_kernel_text_ro() are marking pages starting
from _text to __start_rodata as RW or RO.
With CONFIG_DEBUG_RODATA, there might be free pages (associated with
padding the sections to 2MB large page boundary) between text
and rodata sections that are given back to page allocator. So we should
use only use the start (__text) and end (__stop___ex_table) of the
text section in set_kernel_text_rw()/set_kernel_text_ro().
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
---
arch/x86/mm/init_64.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
Index: tip/arch/x86/mm/init_64.c
===================================================================
--- tip.orig/arch/x86/mm/init_64.c
+++ tip/arch/x86/mm/init_64.c
@@ -700,7 +700,7 @@ int kernel_set_to_readonly;
void set_kernel_text_rw(void)
{
unsigned long start = PFN_ALIGN(_text);
- unsigned long end = PFN_ALIGN(__start_rodata);
+ unsigned long end = PFN_ALIGN(__stop___ex_table);
if (!kernel_set_to_readonly)
return;
@@ -708,13 +708,18 @@ void set_kernel_text_rw(void)
pr_debug("Set kernel text: %lx - %lx for read write\n",
start, end);
+ /*
+ * Make the kernel identity mapping for text RW. Kernel text
+ * mapping will always be RO. Refer to the comment in
+ * static_protections() in pageattr.c
+ */
set_memory_rw(start, (end - start) >> PAGE_SHIFT);
}
void set_kernel_text_ro(void)
{
unsigned long start = PFN_ALIGN(_text);
- unsigned long end = PFN_ALIGN(__start_rodata);
+ unsigned long end = PFN_ALIGN(__stop___ex_table);
if (!kernel_set_to_readonly)
return;
@@ -722,6 +727,9 @@ void set_kernel_text_ro(void)
pr_debug("Set kernel text: %lx - %lx for read only\n",
start, end);
+ /*
+ * Set the kernel identity mapping for text RO.
+ */
set_memory_ro(start, (end - start) >> PAGE_SHIFT);
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro
2009-10-29 2:06 ` Steven Rostedt
@ 2009-10-30 19:17 ` Suresh Siddha
2009-10-30 19:59 ` Steven Rostedt
0 siblings, 1 reply; 10+ messages in thread
From: Suresh Siddha @ 2009-10-30 19:17 UTC (permalink / raw)
To: rostedt@goodmis.org
Cc: mingo@elte.hu, hpa@zytor.com, linux-kernel@vger.kernel.org
On Wed, 2009-10-28 at 19:06 -0700, Steven Rostedt wrote:
> On Wed, 2009-10-28 at 18:46 -0800, Suresh Siddha wrote:
> > plain text document attachment (fix_kernel_text_ro_rw.patch)
> > set_kernel_text_rw()/set_kernel_text_ro() are marking pages starting
> > from _text to __start_rodata as RW or RO.
> >
> > With CONFIG_DEBUG_RODATA, there might be free pages (associated with
> > padding the sections to 2MB large page boundary) between text
> > and rodata sections that are given back to page allocator. So we should
> > use only use the start (__text) and end (__stop___ex_table) of the
> > text section in set_kernel_text_rw()/set_kernel_text_ro().
> >
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
> > ---
> >
>
> I'll go ahead and test this to make sure it does not bust ftrace with an
> allyesconfig.
Steve, Good to go?
If so, Ingo can you please consider this patchset?
thanks,
suresh
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro
2009-10-30 19:17 ` Suresh Siddha
@ 2009-10-30 19:59 ` Steven Rostedt
0 siblings, 0 replies; 10+ messages in thread
From: Steven Rostedt @ 2009-10-30 19:59 UTC (permalink / raw)
To: Suresh Siddha; +Cc: mingo@elte.hu, hpa@zytor.com, linux-kernel@vger.kernel.org
On Fri, 2009-10-30 at 11:17 -0800, Suresh Siddha wrote:
> On Wed, 2009-10-28 at 19:06 -0700, Steven Rostedt wrote:
> > On Wed, 2009-10-28 at 18:46 -0800, Suresh Siddha wrote:
> > > plain text document attachment (fix_kernel_text_ro_rw.patch)
> > > set_kernel_text_rw()/set_kernel_text_ro() are marking pages starting
> > > from _text to __start_rodata as RW or RO.
> > >
> > > With CONFIG_DEBUG_RODATA, there might be free pages (associated with
> > > padding the sections to 2MB large page boundary) between text
> > > and rodata sections that are given back to page allocator. So we should
> > > use only use the start (__text) and end (__stop___ex_table) of the
> > > text section in set_kernel_text_rw()/set_kernel_text_ro().
> > >
> > > Cc: Steven Rostedt <rostedt@goodmis.org>
> > > Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
> > > ---
> > >
> >
> > I'll go ahead and test this to make sure it does not bust ftrace with an
> > allyesconfig.
>
> Steve, Good to go?
Yep. Sorry, during the testing I hit the jprobe vs function graph bug
and got distracted. But as for this patch set ...
Tested-by: Steven Rostedt <rostedt@goodmis.org>
Thanks,
-- Steve
>
> If so, Ingo can you please consider this patchset?
^ permalink raw reply [flat|nested] 10+ messages in thread
* [tip:x86/mm] x86, cpa: Fix kernel text RO checks in static_protection()
2009-10-29 2:46 [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection() Suresh Siddha
` (2 preceding siblings ...)
2009-10-29 2:46 ` [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro Suresh Siddha
@ 2009-11-02 18:54 ` tip-bot for Suresh Siddha
3 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Suresh Siddha @ 2009-11-02 18:54 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, suresh.b.siddha, tglx, mingo
Commit-ID: 502f660466ba7a66711ffdf414b1f7f1131dcbf7
Gitweb: http://git.kernel.org/tip/502f660466ba7a66711ffdf414b1f7f1131dcbf7
Author: Suresh Siddha <suresh.b.siddha@intel.com>
AuthorDate: Wed, 28 Oct 2009 18:46:56 -0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 2 Nov 2009 17:16:35 +0100
x86, cpa: Fix kernel text RO checks in static_protection()
Steven Rostedt reported that we are unconditionally making the
kernel text mapping as read-only. i.e., if someone does cpa() to
the kernel text area for setting/clearing any page table
attribute, we unconditionally clear the read-write attribute for
the kernel text mapping that is set at compile time.
We should delay (to forbid the write attribute) and enforce only
after the kernel has mapped the text as read-only.
Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Tested-by: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20091029024820.996634347@sbs-t61.sc.intel.com>
[ marked kernel_set_to_readonly as __read_mostly ]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/include/asm/cacheflush.h | 1 +
arch/x86/mm/init_32.c | 2 +-
arch/x86/mm/init_64.c | 2 +-
arch/x86/mm/pageattr.c | 10 ++++++----
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h
index b54f6af..eebb2cd 100644
--- a/arch/x86/include/asm/cacheflush.h
+++ b/arch/x86/include/asm/cacheflush.h
@@ -176,6 +176,7 @@ void clflush_cache_range(void *addr, unsigned int size);
#ifdef CONFIG_DEBUG_RODATA
void mark_rodata_ro(void);
extern const int rodata_test_data;
+extern int kernel_set_to_readonly;
void set_kernel_text_rw(void);
void set_kernel_text_ro(void);
#else
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
index f64d0d5..c973f8e 100644
--- a/arch/x86/mm/init_32.c
+++ b/arch/x86/mm/init_32.c
@@ -997,7 +997,7 @@ static noinline int do_test_wp_bit(void)
const int rodata_test_data = 0xC3;
EXPORT_SYMBOL_GPL(rodata_test_data);
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly __read_mostly;
void set_kernel_text_rw(void)
{
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 0ed09fa..4b507c0 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -695,7 +695,7 @@ void __init mem_init(void)
const int rodata_test_data = 0xC3;
EXPORT_SYMBOL_GPL(rodata_test_data);
-static int kernel_set_to_readonly;
+int kernel_set_to_readonly;
void set_kernel_text_rw(void)
{
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 78d3168..8d1e8d9 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [tip:x86/mm] x86_64, ftrace: Make ftrace use kernel identity mapping to modify code
2009-10-29 2:46 ` [patch 2/3] x86_64, ftrace: make ftrace use kernel identity mapping to modify code Suresh Siddha
@ 2009-11-02 18:54 ` tip-bot for Suresh Siddha
0 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Suresh Siddha @ 2009-11-02 18:54 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, suresh.b.siddha, tglx, mingo
Commit-ID: 55ca3cc1746335bb6ef1d3894ddb6d0c729b3518
Gitweb: http://git.kernel.org/tip/55ca3cc1746335bb6ef1d3894ddb6d0c729b3518
Author: Suresh Siddha <suresh.b.siddha@intel.com>
AuthorDate: Wed, 28 Oct 2009 18:46:57 -0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 2 Nov 2009 17:16:36 +0100
x86_64, ftrace: Make ftrace use kernel identity mapping to modify code
On x86_64, kernel text mappings are mapped read-only with
CONFIG_DEBUG_RODATA. So use the kernel identity mapping instead
of the kernel text mapping to modify the kernel text.
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Tested-by: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20091029024821.080941108@sbs-t61.sc.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/kernel/ftrace.c | 17 +++++++++++++++++
arch/x86/mm/pageattr.c | 3 +--
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index 9dbb527..944e982 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -187,9 +187,26 @@ static void wait_for_nmi(void)
nmi_wait_count++;
}
+static inline int
+within(unsigned long addr, unsigned long start, unsigned long end)
+{
+ return addr >= start && addr < end;
+}
+
static int
do_ftrace_mod_code(unsigned long ip, void *new_code)
{
+ /*
+ * On x86_64, kernel text mappings are mapped read-only with
+ * CONFIG_DEBUG_RODATA. So we use the kernel identity mapping instead
+ * of the kernel text mapping to modify the kernel text.
+ *
+ * For 32bit kernels, these mappings are same and we can use
+ * kernel identity mapping to modify code.
+ */
+ if (within(ip, (unsigned long)_text, (unsigned long)_etext))
+ ip = (unsigned long)__va(__pa(ip));
+
mod_code_ip = (void *)ip;
mod_code_newcode = new_code;
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 8d1e8d9..09a140c 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -279,8 +279,7 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
__pa((unsigned long)__end_rodata) >> PAGE_SHIFT))
pgprot_val(forbidden) |= _PAGE_RW;
-#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) && \
- !defined(CONFIG_DYNAMIC_FTRACE)
+#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)
/*
* 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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [tip:x86/mm] x86_64, cpa: Use only text section in set_kernel_text_rw/ro
2009-10-29 2:46 ` [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro Suresh Siddha
2009-10-29 2:06 ` Steven Rostedt
@ 2009-11-02 18:55 ` tip-bot for Suresh Siddha
1 sibling, 0 replies; 10+ messages in thread
From: tip-bot for Suresh Siddha @ 2009-11-02 18:55 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, rostedt, suresh.b.siddha, tglx, mingo
Commit-ID: e7d23dde9b7ebb575e2bcee2abefc9ec1e4adde9
Gitweb: http://git.kernel.org/tip/e7d23dde9b7ebb575e2bcee2abefc9ec1e4adde9
Author: Suresh Siddha <suresh.b.siddha@intel.com>
AuthorDate: Wed, 28 Oct 2009 18:46:58 -0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 2 Nov 2009 17:17:24 +0100
x86_64, cpa: Use only text section in set_kernel_text_rw/ro
set_kernel_text_rw()/set_kernel_text_ro() are marking pages
starting from _text to __start_rodata as RW or RO.
With CONFIG_DEBUG_RODATA, there might be free pages (associated
with padding the sections to 2MB large page boundary) between
text and rodata sections that are given back to page allocator.
So we should use only use the start (__text) and end
(__stop___ex_table) of the text section in
set_kernel_text_rw()/set_kernel_text_ro().
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Tested-by: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20091029024821.164525222@sbs-t61.sc.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/mm/init_64.c | 12 ++++++++++--
1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 4b507c0..5198b9b 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -700,7 +700,7 @@ int kernel_set_to_readonly;
void set_kernel_text_rw(void)
{
unsigned long start = PFN_ALIGN(_text);
- unsigned long end = PFN_ALIGN(__start_rodata);
+ unsigned long end = PFN_ALIGN(__stop___ex_table);
if (!kernel_set_to_readonly)
return;
@@ -708,13 +708,18 @@ void set_kernel_text_rw(void)
pr_debug("Set kernel text: %lx - %lx for read write\n",
start, end);
+ /*
+ * Make the kernel identity mapping for text RW. Kernel text
+ * mapping will always be RO. Refer to the comment in
+ * static_protections() in pageattr.c
+ */
set_memory_rw(start, (end - start) >> PAGE_SHIFT);
}
void set_kernel_text_ro(void)
{
unsigned long start = PFN_ALIGN(_text);
- unsigned long end = PFN_ALIGN(__start_rodata);
+ unsigned long end = PFN_ALIGN(__stop___ex_table);
if (!kernel_set_to_readonly)
return;
@@ -722,6 +727,9 @@ void set_kernel_text_ro(void)
pr_debug("Set kernel text: %lx - %lx for read only\n",
start, end);
+ /*
+ * Set the kernel identity mapping for text RO.
+ */
set_memory_ro(start, (end - start) >> PAGE_SHIFT);
}
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-11-02 18:56 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-29 2:46 [patch 1/3] x86, cpa: fix kernel text RO checks in static_protection() Suresh Siddha
2009-10-29 2:05 ` Steven Rostedt
2009-10-29 2:46 ` [patch 2/3] x86_64, ftrace: make ftrace use kernel identity mapping to modify code Suresh Siddha
2009-11-02 18:54 ` [tip:x86/mm] x86_64, ftrace: Make " tip-bot for Suresh Siddha
2009-10-29 2:46 ` [patch 3/3] x86_64, cpa: use only text section in set_kernel_text_rw/ro Suresh Siddha
2009-10-29 2:06 ` Steven Rostedt
2009-10-30 19:17 ` Suresh Siddha
2009-10-30 19:59 ` Steven Rostedt
2009-11-02 18:55 ` [tip:x86/mm] x86_64, cpa: Use " tip-bot for Suresh Siddha
2009-11-02 18:54 ` [tip:x86/mm] x86, cpa: Fix kernel text RO checks in static_protection() tip-bot for Suresh Siddha
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox