Loading arch/x86/kernel/paravirt.c +2 −0 Original line number Diff line number Diff line Loading @@ -420,6 +420,8 @@ struct pv_mmu_ops pv_mmu_ops = { .enter = paravirt_nop, .leave = paravirt_nop, }, .set_fixmap = native_set_fixmap, }; EXPORT_SYMBOL_GPL(pv_time_ops); Loading arch/x86/mm/init_64.c +4 −17 Original line number Diff line number Diff line Loading @@ -148,15 +148,15 @@ static __init void *spp_getpage(void) return ptr; } static __init void set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) void set_pte_vaddr(unsigned long vaddr, pte_t new_pte) { pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t *pte, new_pte; pte_t *pte; pr_debug("set_pte_phys %lx to %lx\n", vaddr, phys); pr_debug("set_pte_vaddr %lx to %lx\n", vaddr, native_pte_val(new_pte)); pgd = pgd_offset_k(vaddr); if (pgd_none(*pgd)) { Loading @@ -183,7 +183,6 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) return; } } new_pte = pfn_pte(phys >> PAGE_SHIFT, prot); pte = pte_offset_kernel(pmd, vaddr); if (!pte_none(*pte) && pte_val(new_pte) && Loading Loading @@ -226,18 +225,6 @@ 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) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { printk(KERN_ERR "Invalid __set_fixmap\n"); return; } set_pte_phys(address, phys, prot); } static unsigned long __initdata table_start; static unsigned long __meminitdata table_end; Loading arch/x86/mm/pgtable.c +20 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include <asm/pgalloc.h> #include <asm/pgtable.h> #include <asm/tlb.h> #include <asm/fixmap.h> pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { Loading Loading @@ -274,3 +275,22 @@ int ptep_clear_flush_young(struct vm_area_struct *vma, return young; } int fixmaps_set; void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { BUG(); return; } set_pte_vaddr(address, pte); fixmaps_set++; } void native_set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags) { __native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags)); } arch/x86/mm/pgtable_32.c +4 −16 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ void show_mem(void) * Associate a virtual page frame with a given physical page frame * and protection flags for that frame. */ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) void set_pte_vaddr(unsigned long vaddr, pte_t pteval) { pgd_t *pgd; pud_t *pud; Loading @@ -94,8 +94,8 @@ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) return; } pte = pte_offset_kernel(pmd, vaddr); if (pgprot_val(flags)) set_pte_present(&init_mm, vaddr, pte, pfn_pte(pfn, flags)); if (pte_val(pteval)) set_pte_present(&init_mm, vaddr, pte, pteval); else pte_clear(&init_mm, vaddr, pte); Loading Loading @@ -145,18 +145,6 @@ static int fixmaps; unsigned long __FIXADDR_TOP = 0xfffff000; EXPORT_SYMBOL(__FIXADDR_TOP); void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { BUG(); return; } set_pte_pfn(address, phys >> PAGE_SHIFT, flags); fixmaps++; } /** * reserve_top_address - reserves a hole in the top of kernel address space * @reserve - size of hole to reserve Loading @@ -166,7 +154,7 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) */ void reserve_top_address(unsigned long reserve) { BUG_ON(fixmaps > 0); BUG_ON(fixmaps_set > 0); printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", (int)-reserve); __FIXADDR_TOP = -reserve - PAGE_SIZE; Loading arch/x86/xen/enlighten.c +29 −0 Original line number Diff line number Diff line Loading @@ -1013,6 +1013,33 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf, return ret; } static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) { pte_t pte; phys >>= PAGE_SHIFT; switch (idx) { case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: #ifdef CONFIG_X86_F00F_BUG case FIX_F00F_IDT: #endif case FIX_WP_TEST: case FIX_VDSO: #ifdef CONFIG_X86_LOCAL_APIC case FIX_APIC_BASE: /* maps dummy local APIC */ #endif pte = pfn_pte(phys, prot); break; default: pte = mfn_pte(phys, prot); break; } __native_set_fixmap(idx, pte); } static const struct pv_info xen_info __initdata = { .paravirt_enabled = 1, .shared_kernel_pmd = 0, Loading Loading @@ -1167,6 +1194,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { .enter = paravirt_enter_lazy_mmu, .leave = xen_leave_lazy, }, .set_fixmap = xen_set_fixmap, }; #ifdef CONFIG_SMP Loading Loading
arch/x86/kernel/paravirt.c +2 −0 Original line number Diff line number Diff line Loading @@ -420,6 +420,8 @@ struct pv_mmu_ops pv_mmu_ops = { .enter = paravirt_nop, .leave = paravirt_nop, }, .set_fixmap = native_set_fixmap, }; EXPORT_SYMBOL_GPL(pv_time_ops); Loading
arch/x86/mm/init_64.c +4 −17 Original line number Diff line number Diff line Loading @@ -148,15 +148,15 @@ static __init void *spp_getpage(void) return ptr; } static __init void set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) void set_pte_vaddr(unsigned long vaddr, pte_t new_pte) { pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t *pte, new_pte; pte_t *pte; pr_debug("set_pte_phys %lx to %lx\n", vaddr, phys); pr_debug("set_pte_vaddr %lx to %lx\n", vaddr, native_pte_val(new_pte)); pgd = pgd_offset_k(vaddr); if (pgd_none(*pgd)) { Loading @@ -183,7 +183,6 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) return; } } new_pte = pfn_pte(phys >> PAGE_SHIFT, prot); pte = pte_offset_kernel(pmd, vaddr); if (!pte_none(*pte) && pte_val(new_pte) && Loading Loading @@ -226,18 +225,6 @@ 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) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { printk(KERN_ERR "Invalid __set_fixmap\n"); return; } set_pte_phys(address, phys, prot); } static unsigned long __initdata table_start; static unsigned long __meminitdata table_end; Loading
arch/x86/mm/pgtable.c +20 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include <asm/pgalloc.h> #include <asm/pgtable.h> #include <asm/tlb.h> #include <asm/fixmap.h> pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { Loading Loading @@ -274,3 +275,22 @@ int ptep_clear_flush_young(struct vm_area_struct *vma, return young; } int fixmaps_set; void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { BUG(); return; } set_pte_vaddr(address, pte); fixmaps_set++; } void native_set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags) { __native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags)); }
arch/x86/mm/pgtable_32.c +4 −16 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ void show_mem(void) * Associate a virtual page frame with a given physical page frame * and protection flags for that frame. */ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) void set_pte_vaddr(unsigned long vaddr, pte_t pteval) { pgd_t *pgd; pud_t *pud; Loading @@ -94,8 +94,8 @@ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) return; } pte = pte_offset_kernel(pmd, vaddr); if (pgprot_val(flags)) set_pte_present(&init_mm, vaddr, pte, pfn_pte(pfn, flags)); if (pte_val(pteval)) set_pte_present(&init_mm, vaddr, pte, pteval); else pte_clear(&init_mm, vaddr, pte); Loading Loading @@ -145,18 +145,6 @@ static int fixmaps; unsigned long __FIXADDR_TOP = 0xfffff000; EXPORT_SYMBOL(__FIXADDR_TOP); void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) { unsigned long address = __fix_to_virt(idx); if (idx >= __end_of_fixed_addresses) { BUG(); return; } set_pte_pfn(address, phys >> PAGE_SHIFT, flags); fixmaps++; } /** * reserve_top_address - reserves a hole in the top of kernel address space * @reserve - size of hole to reserve Loading @@ -166,7 +154,7 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) */ void reserve_top_address(unsigned long reserve) { BUG_ON(fixmaps > 0); BUG_ON(fixmaps_set > 0); printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", (int)-reserve); __FIXADDR_TOP = -reserve - PAGE_SIZE; Loading
arch/x86/xen/enlighten.c +29 −0 Original line number Diff line number Diff line Loading @@ -1013,6 +1013,33 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf, return ret; } static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) { pte_t pte; phys >>= PAGE_SHIFT; switch (idx) { case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: #ifdef CONFIG_X86_F00F_BUG case FIX_F00F_IDT: #endif case FIX_WP_TEST: case FIX_VDSO: #ifdef CONFIG_X86_LOCAL_APIC case FIX_APIC_BASE: /* maps dummy local APIC */ #endif pte = pfn_pte(phys, prot); break; default: pte = mfn_pte(phys, prot); break; } __native_set_fixmap(idx, pte); } static const struct pv_info xen_info __initdata = { .paravirt_enabled = 1, .shared_kernel_pmd = 0, Loading Loading @@ -1167,6 +1194,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { .enter = paravirt_enter_lazy_mmu, .leave = xen_leave_lazy, }, .set_fixmap = xen_set_fixmap, }; #ifdef CONFIG_SMP Loading