diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2011-04-14 19:25:21 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2011-04-15 13:55:18 -0400 |
commit | d7dd2ff11b7fcd425aca5a875983c862d19a67ae (patch) | |
tree | 6ad74d89d2355861b513eefb763ea6103a8d68e7 /arch/parisc/kernel/module.c | |
parent | e38f5b745075828ac51b12c8c95c85a7be4a3ec7 (diff) |
[PARISC] only make executable areas executable
Currently parisc has the whole kernel marked as RWX, meaning any
kernel page at all is eligible to be executed. This can cause a
theoretical problem on systems with combined I/D TLB because the act
of referencing a page causes a TLB insertion with an executable bit.
This TLB entry may be used by the CPU as the basis for speculating the
page into the I-Cache. If this speculated page is subsequently used
for a user process, there is the possibility we will get a stale
I-cache line picked up as the binary executes.
As a point of good practise, only mark actual kernel text pages as
executable. The same has to be done for init_text pages, but they're
converted to data pages (and the I-Cache flushed) when the init memory
is released.
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'arch/parisc/kernel/module.c')
-rw-r--r-- | arch/parisc/kernel/module.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 6e81bb596e5b..cedbbb8b18d9 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -61,8 +61,10 @@ | |||
61 | #include <linux/string.h> | 61 | #include <linux/string.h> |
62 | #include <linux/kernel.h> | 62 | #include <linux/kernel.h> |
63 | #include <linux/bug.h> | 63 | #include <linux/bug.h> |
64 | #include <linux/mm.h> | ||
64 | #include <linux/slab.h> | 65 | #include <linux/slab.h> |
65 | 66 | ||
67 | #include <asm/pgtable.h> | ||
66 | #include <asm/unwind.h> | 68 | #include <asm/unwind.h> |
67 | 69 | ||
68 | #if 0 | 70 | #if 0 |
@@ -214,7 +216,13 @@ void *module_alloc(unsigned long size) | |||
214 | { | 216 | { |
215 | if (size == 0) | 217 | if (size == 0) |
216 | return NULL; | 218 | return NULL; |
217 | return vmalloc(size); | 219 | /* using RWX means less protection for modules, but it's |
220 | * easier than trying to map the text, data, init_text and | ||
221 | * init_data correctly */ | ||
222 | return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, | ||
223 | GFP_KERNEL | __GFP_HIGHMEM, | ||
224 | PAGE_KERNEL_RWX, -1, | ||
225 | __builtin_return_address(0)); | ||
218 | } | 226 | } |
219 | 227 | ||
220 | #ifndef CONFIG_64BIT | 228 | #ifndef CONFIG_64BIT |