Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 63005
b: refs/heads/master
c: 602033e
h: refs/heads/master
i:
  63003: 4289156
v: v3
  • Loading branch information
Linus Torvalds committed Jul 26, 2007
1 parent 6a95fa0 commit ff375b5
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 07d4e9af109221ab731c5aaf832e89776c64b013
refs/heads/master: 602033ed5907a59ce86f709082a35be047743a86
14 changes: 2 additions & 12 deletions trunk/arch/i386/kernel/alternative.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,22 +430,12 @@ void __init alternative_instructions(void)
* And on the local CPU you need to be protected again NMI or MCE handlers
* seeing an inconsistent instruction while you patch.
*/
void __kprobes text_poke(void *oaddr, unsigned char *opcode, int len)
void __kprobes text_poke(void *addr, unsigned char *opcode, int len)
{
u8 *addr = oaddr;
if (!pte_write(*lookup_address((unsigned long)addr))) {
struct page *p[2] = { virt_to_page(addr), virt_to_page(addr+PAGE_SIZE) };
addr = vmap(p, 2, VM_MAP, PAGE_KERNEL);
if (!addr)
return;
addr += ((unsigned long)oaddr) % PAGE_SIZE;
}
memcpy(addr, opcode, len);
sync_core();
/* Not strictly needed, but can speed CPU recovery up. Ignore cross cacheline
case. */
if (cpu_has_clflush)
asm("clflush (%0) " :: "r" (oaddr) : "memory");
if (addr != oaddr)
vunmap(addr);
asm("clflush (%0) " :: "r" (addr) : "memory");
}
14 changes: 11 additions & 3 deletions trunk/arch/i386/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,9 +800,17 @@ void mark_rodata_ro(void)
unsigned long start = PFN_ALIGN(_text);
unsigned long size = PFN_ALIGN(_etext) - start;

change_page_attr(virt_to_page(start),
size >> PAGE_SHIFT, PAGE_KERNEL_RX);
printk("Write protecting the kernel text: %luk\n", size >> 10);
#ifndef CONFIG_KPROBES
#ifdef CONFIG_HOTPLUG_CPU
/* It must still be possible to apply SMP alternatives. */
if (num_possible_cpus() <= 1)
#endif
{
change_page_attr(virt_to_page(start),
size >> PAGE_SHIFT, PAGE_KERNEL_RX);
printk("Write protecting the kernel text: %luk\n", size >> 10);
}
#endif
start += size;
size = (unsigned long)__end_rodata - start;
change_page_attr(virt_to_page(start),
Expand Down
10 changes: 10 additions & 0 deletions trunk/arch/x86_64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,16 @@ void mark_rodata_ro(void)
{
unsigned long start = (unsigned long)_stext, end;

#ifdef CONFIG_HOTPLUG_CPU
/* It must still be possible to apply SMP alternatives. */
if (num_possible_cpus() > 1)
start = (unsigned long)_etext;
#endif

#ifdef CONFIG_KPROBES
start = (unsigned long)__start_rodata;
#endif

end = (unsigned long)__end_rodata;
start = (start + PAGE_SIZE - 1) & PAGE_MASK;
end &= PAGE_MASK;
Expand Down

0 comments on commit ff375b5

Please sign in to comment.