Commit aeaaa59c authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar
Browse files

x86/paravirt/xen: add set_fixmap pv_mmu_ops

parent d494a961
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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);
+7 −2
Original line number Original line Diff line number Diff line
@@ -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)
		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));
}
+29 −0
Original line number Original line Diff line number Diff line
@@ -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 = {
		.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
+12 −2
Original line number Original line Diff line number Diff line
@@ -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);
void native_set_fixmap(enum fixed_addresses idx,
		       unsigned long phys, pgprot_t flags);
		       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)


+13 −0
Original line number Original line Diff line number Diff line
@@ -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)
	}
	}
}
}


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)