提交 aeaaa59c 编写于 作者: J Jeremy Fitzhardinge 提交者: Ingo Molnar

x86/paravirt/xen: add set_fixmap pv_mmu_ops

Signed-off-by: NJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: NJuan Quintela <quintela@redhat.com>
Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
Signed-off-by: NMark McLoughlin <markmc@redhat.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 d494a961
...@@ -416,6 +416,8 @@ struct pv_mmu_ops pv_mmu_ops = { ...@@ -416,6 +416,8 @@ struct pv_mmu_ops pv_mmu_ops = {
.enter = paravirt_nop, .enter = paravirt_nop,
.leave = paravirt_nop, .leave = paravirt_nop,
}, },
.set_fixmap = native_set_fixmap,
}; };
EXPORT_SYMBOL_GPL(pv_time_ops); EXPORT_SYMBOL_GPL(pv_time_ops);
......
...@@ -277,7 +277,7 @@ int ptep_clear_flush_young(struct vm_area_struct *vma, ...@@ -277,7 +277,7 @@ int ptep_clear_flush_young(struct vm_area_struct *vma,
int fixmaps_set; int fixmaps_set;
void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) void __native_set_fixmap(enum fixed_addresses idx, pte_t pte)
{ {
unsigned long address = __fix_to_virt(idx); unsigned long address = __fix_to_virt(idx);
...@@ -285,6 +285,11 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) ...@@ -285,6 +285,11 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
BUG(); BUG();
return; return;
} }
set_pte_vaddr(address, pfn_pte(phys >> PAGE_SHIFT, flags)); set_pte_vaddr(address, pte);
fixmaps_set++; 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));
}
...@@ -960,6 +960,33 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf, ...@@ -960,6 +960,33 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf,
return ret; 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 = { static const struct pv_info xen_info __initdata = {
.paravirt_enabled = 1, .paravirt_enabled = 1,
.shared_kernel_pmd = 0, .shared_kernel_pmd = 0,
...@@ -1112,6 +1139,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { ...@@ -1112,6 +1139,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = {
.enter = paravirt_enter_lazy_mmu, .enter = paravirt_enter_lazy_mmu,
.leave = xen_leave_lazy, .leave = xen_leave_lazy,
}, },
.set_fixmap = xen_set_fixmap,
}; };
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -9,8 +9,18 @@ ...@@ -9,8 +9,18 @@
extern int fixmaps_set; extern int fixmaps_set;
extern void __set_fixmap(enum fixed_addresses idx, void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
unsigned long phys, pgprot_t flags); void native_set_fixmap(enum fixed_addresses idx,
unsigned long phys, pgprot_t flags);
#ifndef CONFIG_PARAVIRT
static inline void __set_fixmap(enum fixed_addresses idx,
unsigned long phys, pgprot_t flags)
{
native_set_fixmap(idx, phys, flags);
}
#endif
#define set_fixmap(idx, phys) \ #define set_fixmap(idx, phys) \
__set_fixmap(idx, phys, PAGE_KERNEL) __set_fixmap(idx, phys, PAGE_KERNEL)
......
...@@ -273,6 +273,13 @@ struct pv_mmu_ops { ...@@ -273,6 +273,13 @@ struct pv_mmu_ops {
#endif #endif
struct pv_lazy_ops lazy_mode; struct pv_lazy_ops lazy_mode;
/* dom0 ops */
/* Sometimes the physical address is a pfn, and sometimes its
an mfn. We can tell which is which from the index. */
void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
unsigned long phys, pgprot_t flags);
}; };
/* This contains all the paravirt structures: we get a convenient /* This contains all the paravirt structures: we get a convenient
...@@ -1252,6 +1259,12 @@ static inline void arch_flush_lazy_mmu_mode(void) ...@@ -1252,6 +1259,12 @@ static inline void arch_flush_lazy_mmu_mode(void)
} }
} }
static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
unsigned long phys, pgprot_t flags)
{
pv_mmu_ops.set_fixmap(idx, phys, flags);
}
void _paravirt_nop(void); void _paravirt_nop(void);
#define paravirt_nop ((void *)_paravirt_nop) #define paravirt_nop ((void *)_paravirt_nop)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册