Merge branch 'devel-stable' into for-next
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 5 Dec 2014 16:30:54 +0000 (16:30 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 5 Dec 2014 16:30:54 +0000 (16:30 +0000)
1  2 
arch/arm/kernel/Makefile
arch/arm/kernel/machine_kexec.c
arch/arm/mm/Kconfig
arch/arm/mm/highmem.c
arch/arm/mm/init.c
arch/arm/mm/mmu.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -356,6 -355,67 +357,29 @@@ const struct mem_type *get_mem_type(uns
  }
  EXPORT_SYMBOL(get_mem_type);
  
 -#define PTE_SET_FN(_name, pteop) \
 -static int pte_set_##_name(pte_t *ptep, pgtable_t token, unsigned long addr, \
 -                      void *data) \
 -{ \
 -      pte_t pte = pteop(*ptep); \
 -\
 -      set_pte_ext(ptep, pte, 0); \
 -      return 0; \
 -} \
 -
 -#define SET_MEMORY_FN(_name, callback) \
 -int set_memory_##_name(unsigned long addr, int numpages) \
 -{ \
 -      unsigned long start = addr; \
 -      unsigned long size = PAGE_SIZE*numpages; \
 -      unsigned end = start + size; \
 -\
 -      if (start < MODULES_VADDR || start >= MODULES_END) \
 -              return -EINVAL;\
 -\
 -      if (end < MODULES_VADDR || end >= MODULES_END) \
 -              return -EINVAL; \
 -\
 -      apply_to_page_range(&init_mm, start, size, callback, NULL); \
 -      flush_tlb_kernel_range(start, end); \
 -      return 0;\
 -}
 -
 -PTE_SET_FN(ro, pte_wrprotect)
 -PTE_SET_FN(rw, pte_mkwrite)
 -PTE_SET_FN(x, pte_mkexec)
 -PTE_SET_FN(nx, pte_mknexec)
 -
 -SET_MEMORY_FN(ro, pte_set_ro)
 -SET_MEMORY_FN(rw, pte_set_rw)
 -SET_MEMORY_FN(x, pte_set_x)
 -SET_MEMORY_FN(nx, pte_set_nx)
 -
+ /*
+  * To avoid TLB flush broadcasts, this uses local_flush_tlb_kernel_range().
+  * As a result, this can only be called with preemption disabled, as under
+  * stop_machine().
+  */
+ void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot)
+ {
+       unsigned long vaddr = __fix_to_virt(idx);
+       pte_t *pte = pte_offset_kernel(pmd_off_k(vaddr), vaddr);
+       /* Make sure fixmap region does not exceed available allocation. */
+       BUILD_BUG_ON(FIXADDR_START + (__end_of_fixed_addresses * PAGE_SIZE) >
+                    FIXADDR_END);
+       BUG_ON(idx >= __end_of_fixed_addresses);
+       if (pgprot_val(prot))
+               set_pte_at(NULL, vaddr, pte,
+                       pfn_pte(phys >> PAGE_SHIFT, prot));
+       else
+               pte_clear(NULL, vaddr, pte);
+       local_flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE);
+ }
  /*
   * Adjust the PMD section entries according to the CPU in use.
   */