Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd0e101d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-linus' of...

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-x86-fixes4

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-x86-fixes4:
  x86: harden kernel code patching
  x86: clean up text_poke()
  x86: fix text_poke()
  x86: remove set_fixmap() warning
  x86: make __set_fixmap() non-init
  x86: make clear_fixmap() available on 64-bit as well
parents cf2ec150 00c6b2d5
Loading
Loading
Loading
Loading
+19 −20
Original line number Diff line number Diff line
@@ -511,13 +511,18 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
	unsigned long flags;
	char *vaddr;
	int nr_pages = 2;
	struct page *pages[2];
	int i;

	BUG_ON(len > sizeof(long));
	BUG_ON((((long)addr + len - 1) & ~(sizeof(long) - 1))
		- ((long)addr & ~(sizeof(long) - 1)));
	if (kernel_text_address((unsigned long)addr)) {
		struct page *pages[2] = { virt_to_page(addr),
			virt_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);
	} else {
		pages[0] = virt_to_page(addr);
		WARN_ON(!PageReserved(pages[0]));
		pages[1] = virt_to_page(addr + PAGE_SIZE);
	}
	BUG_ON(!pages[0]);
	if (!pages[1])
		nr_pages = 1;
	vaddr = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
@@ -526,16 +531,10 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
	memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len);
	local_irq_restore(flags);
	vunmap(vaddr);
	} else {
		/*
		 * modules are in vmalloc'ed memory, always writable.
		 */
		local_irq_save(flags);
		memcpy(addr, opcode, len);
		local_irq_restore(flags);
	}
	sync_core();
	/* Could also do a CLFLUSH here to speed up CPU recovery; but
	   that causes hangs on some VIA CPUs. */
	for (i = 0; i < len; i++)
		BUG_ON(((char *)addr)[i] != ((char *)opcode)[i]);
	return addr;
}
+3 −4
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ static __init void *spp_getpage(void)
	return ptr;
}

static __init void
static void
set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
{
	pgd_t *pgd;
@@ -173,7 +173,7 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
	new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);

	pte = pte_offset_kernel(pmd, vaddr);
	if (!pte_none(*pte) &&
	if (!pte_none(*pte) && pte_val(new_pte) &&
	    pte_val(*pte) != (pte_val(new_pte) & __supported_pte_mask))
		pte_ERROR(*pte);
	set_pte(pte, new_pte);
@@ -214,8 +214,7 @@ void __init cleanup_highmap(void)
}

/* NOTE: this is meant to be run only at boot */
void __init
__set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
{
	unsigned long address = __fix_to_virt(idx);

+8 −0
Original line number Diff line number Diff line
#ifndef _ASM_FIXMAP_H
#define _ASM_FIXMAP_H

#ifdef CONFIG_X86_32
# include "fixmap_32.h"
#else
# include "fixmap_64.h"
#endif

#define clear_fixmap(idx)			\
	__set_fixmap(idx, 0, __pgprot(0))

#endif
+2 −5
Original line number Diff line number Diff line
@@ -10,8 +10,8 @@
 * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
 */

#ifndef _ASM_FIXMAP_H
#define _ASM_FIXMAP_H
#ifndef _ASM_FIXMAP_32_H
#define _ASM_FIXMAP_32_H


/* used by vmalloc.c, vsyscall.lds.S.
@@ -121,9 +121,6 @@ extern void reserve_top_address(unsigned long reserve);
#define set_fixmap_nocache(idx, phys)			\
	__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)

#define clear_fixmap(idx)			\
	__set_fixmap(idx, 0, __pgprot(0))

#define FIXADDR_TOP	((unsigned long)__FIXADDR_TOP)

#define __FIXADDR_SIZE	(__end_of_permanent_fixed_addresses << PAGE_SHIFT)
+2 −2
Original line number Diff line number Diff line
@@ -8,8 +8,8 @@
 * Copyright (C) 1998 Ingo Molnar
 */

#ifndef _ASM_FIXMAP_H
#define _ASM_FIXMAP_H
#ifndef _ASM_FIXMAP_64_H
#define _ASM_FIXMAP_64_H

#include <linux/kernel.h>
#include <asm/apicdef.h>