Signed-off-by: Ingo Molnar <mingo@elte.hu>
*/
void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
{
*/
void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
{
char *vaddr;
int nr_pages = 2;
struct page *pages[2];
int i;
char *vaddr;
int nr_pages = 2;
struct page *pages[2];
int i;
if (!core_kernel_text((unsigned long)addr)) {
pages[0] = vmalloc_to_page(addr);
pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
if (!core_kernel_text((unsigned long)addr)) {
pages[0] = vmalloc_to_page(addr);
pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
nr_pages = 1;
vaddr = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
BUG_ON(!vaddr);
nr_pages = 1;
vaddr = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
BUG_ON(!vaddr);
memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len);
memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len);
- local_irq_restore(flags);
vunmap(vaddr);
sync_core();
/* Could also do a CLFLUSH here to speed up CPU recovery; but
vunmap(vaddr);
sync_core();
/* Could also do a CLFLUSH here to speed up CPU recovery; but
void vunmap(const void *addr)
{
BUG_ON(in_interrupt());
void vunmap(const void *addr)
{
BUG_ON(in_interrupt());
__vunmap(addr, 0);
}
EXPORT_SYMBOL(vunmap);
__vunmap(addr, 0);
}
EXPORT_SYMBOL(vunmap);
{
struct vm_struct *area;
{
struct vm_struct *area;
if (count > num_physpages)
return NULL;
if (count > num_physpages)
return NULL;