Merge branch 'master' into x86/memblock
Conflicts & resolutions: * arch/x86/xen/setup.cdc91c728fd
"xen: allow extra memory to be in multiple regions"24aa07882b
"memblock, x86: Replace memblock_x86_reserve/free..." conflicted on xen_add_extra_mem() updates. The resolution is trivial as the latter just want to replace memblock_x86_reserve_range() with memblock_reserve(). * drivers/pci/intel-iommu.c166e9278a3
"x86/ia64: intel-iommu: move to drivers/iommu/"5dfe8660a3
"bootmem: Replace work_with_active_regions() with..." conflicted as the former moved the file under drivers/iommu/. Resolved by applying the chnages from the latter on the moved file. * mm/Kconfig6661672053
"memblock: add NO_BOOTMEM config symbol"c378ddd53f
"memblock, x86: Make ARCH_DISCARD_MEMBLOCK a config option" conflicted trivially. Both added config options. Just letting both add their own options resolves the conflict. * mm/memblock.cd1f0ece6cd
"mm/memblock.c: small function definition fixes"ed7b56a799
"memblock: Remove memblock_memory_can_coalesce()" confliected. The former updates function removed by the latter. Resolution is trivial. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
@@ -511,6 +511,11 @@ static void __init read_obp_translations(void)
|
||||
for (i = 0; i < prom_trans_ents; i++)
|
||||
prom_trans[i].data &= ~0x0003fe0000000000UL;
|
||||
}
|
||||
|
||||
/* Force execute bit on. */
|
||||
for (i = 0; i < prom_trans_ents; i++)
|
||||
prom_trans[i].data |= (tlb_type == hypervisor ?
|
||||
_PAGE_EXEC_4V : _PAGE_EXEC_4U);
|
||||
}
|
||||
|
||||
static void __init hypervisor_tlb_lock(unsigned long vaddr,
|
||||
@@ -1597,6 +1602,44 @@ static void __init tsb_phys_patch(void)
|
||||
static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR];
|
||||
extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];
|
||||
|
||||
static void patch_one_ktsb_phys(unsigned int *start, unsigned int *end, unsigned long pa)
|
||||
{
|
||||
pa >>= KTSB_PHYS_SHIFT;
|
||||
|
||||
while (start < end) {
|
||||
unsigned int *ia = (unsigned int *)(unsigned long)*start;
|
||||
|
||||
ia[0] = (ia[0] & ~0x3fffff) | (pa >> 10);
|
||||
__asm__ __volatile__("flush %0" : : "r" (ia));
|
||||
|
||||
ia[1] = (ia[1] & ~0x3ff) | (pa & 0x3ff);
|
||||
__asm__ __volatile__("flush %0" : : "r" (ia + 1));
|
||||
|
||||
start++;
|
||||
}
|
||||
}
|
||||
|
||||
static void ktsb_phys_patch(void)
|
||||
{
|
||||
extern unsigned int __swapper_tsb_phys_patch;
|
||||
extern unsigned int __swapper_tsb_phys_patch_end;
|
||||
unsigned long ktsb_pa;
|
||||
|
||||
ktsb_pa = kern_base + ((unsigned long)&swapper_tsb[0] - KERNBASE);
|
||||
patch_one_ktsb_phys(&__swapper_tsb_phys_patch,
|
||||
&__swapper_tsb_phys_patch_end, ktsb_pa);
|
||||
#ifndef CONFIG_DEBUG_PAGEALLOC
|
||||
{
|
||||
extern unsigned int __swapper_4m_tsb_phys_patch;
|
||||
extern unsigned int __swapper_4m_tsb_phys_patch_end;
|
||||
ktsb_pa = (kern_base +
|
||||
((unsigned long)&swapper_4m_tsb[0] - KERNBASE));
|
||||
patch_one_ktsb_phys(&__swapper_4m_tsb_phys_patch,
|
||||
&__swapper_4m_tsb_phys_patch_end, ktsb_pa);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init sun4v_ktsb_init(void)
|
||||
{
|
||||
unsigned long ktsb_pa;
|
||||
@@ -1716,8 +1759,10 @@ void __init paging_init(void)
|
||||
sun4u_pgprot_init();
|
||||
|
||||
if (tlb_type == cheetah_plus ||
|
||||
tlb_type == hypervisor)
|
||||
tlb_type == hypervisor) {
|
||||
tsb_phys_patch();
|
||||
ktsb_phys_patch();
|
||||
}
|
||||
|
||||
if (tlb_type == hypervisor) {
|
||||
sun4v_patch_tlb_handlers();
|
||||
|
Reference in New Issue
Block a user