All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC, PATCH 3/5] Paravirt_ops pure functions.patch
@ 2007-04-20  1:52 Zachary Amsden
  0 siblings, 0 replies; only message in thread
From: Zachary Amsden @ 2007-04-20  1:52 UTC (permalink / raw)
  To: Andrew Morton, Andi Kleen, Jeremy Fitzhardinge, Rusty Russell,
	Chris Wright, Ingo Molnar, Petr Vandrovec, Pratap Subrahmanyam,
	Dan Hecht, Dan Arai, Virtualization Mailing List, Chaz Masden,
	Zachary Amsden

Make paravirt-ops be a pure function pointer struct; we already have
assembly code which uses arithmetic by 4 bytes, which means arbitrary
structures are not possible here, and they are not needed.

Signed-off-by: Zachary Amsden <zach@vmware.com>

diff -r a6889086a657 arch/i386/kernel/paravirt.c
--- a/arch/i386/kernel/paravirt.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/paravirt.c	Thu Apr 19 15:53:44 2007 -0700
@@ -35,6 +35,19 @@
 #include <asm/tlbflush.h>
 #include <asm/timer.h>
 
+/* Modules may need to know if paravirt is active */
+int paravirt_enabled;
+EXPORT_SYMBOL(paravirt_enabled);
+
+/* GPLd modules might want to determine and call into backend functions */
+char *paravirt_backend = "bare hardware";
+EXPORT_SYMBOL_GPL(paravirt_backend);
+
+/* Disable PMD sharing; externally set */
+#ifdef CONFIG_X86_PAE
+int use_shared_kernel_pmd = 1;
+#endif
+
 /* nop stub */
 void _paravirt_nop(void)
 {
@@ -43,7 +56,7 @@ static void __init default_banner(void)
 static void __init default_banner(void)
 {
 	printk(KERN_INFO "Booting paravirtualized kernel on %s\n",
-	       paravirt_ops.name);
+	       paravirt_backend);
 }
 
 char *memory_setup(void)
@@ -230,11 +243,6 @@ core_initcall(print_banner);
 core_initcall(print_banner);
 
 struct paravirt_ops paravirt_ops = {
-	.name = "bare hardware",
-	.paravirt_enabled = 0,
-	.kernel_rpl = 0,
-	.shared_kernel_pmd = 1,	/* Only used when CONFIG_X86_PAE is set */
-
  	.patch = native_patch,
 	.banner = default_banner,
 	.arch_setup = paravirt_nop,
diff -r a6889086a657 arch/i386/kernel/apm.c
--- a/arch/i386/kernel/apm.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/apm.c	Thu Apr 19 15:59:56 2007 -0700
@@ -2198,7 +2198,7 @@ static int __init apm_init(void)
 
 	dmi_check_system(apm_dmi_table);
 
-	if (apm_info.bios.version == 0 || paravirt_enabled()) {
+	if (apm_info.bios.version == 0 || paravirt_enabled) {
 		printk(KERN_INFO "apm: BIOS not found.\n");
 		return -ENODEV;
 	}
diff -r a6889086a657 arch/i386/kernel/asm-offsets.c
--- a/arch/i386/kernel/asm-offsets.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/asm-offsets.c	Thu Apr 19 15:58:06 2007 -0700
@@ -108,7 +108,6 @@ void foo(void)
 
 #ifdef CONFIG_PARAVIRT
 	BLANK();
-	OFFSET(PARAVIRT_enabled, paravirt_ops, paravirt_enabled);
 	OFFSET(PARAVIRT_irq_disable, paravirt_ops, irq_disable);
 	OFFSET(PARAVIRT_irq_enable, paravirt_ops, irq_enable);
 	OFFSET(PARAVIRT_irq_enable_sysexit, paravirt_ops, irq_enable_sysexit);
diff -r a6889086a657 arch/i386/kernel/cpu/bugs.c
--- a/arch/i386/kernel/cpu/bugs.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/cpu/bugs.c	Thu Apr 19 15:59:27 2007 -0700
@@ -86,7 +86,7 @@ static void __init check_fpu(void)
 
 static void __init check_hlt(void)
 {
-	if (paravirt_enabled())
+	if (paravirt_enabled)
 		return;
 
 	printk(KERN_INFO "Checking 'hlt' instruction... ");
diff -r a6889086a657 arch/i386/kernel/cpu/intel.c
--- a/arch/i386/kernel/cpu/intel.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/cpu/intel.c	Thu Apr 19 15:59:42 2007 -0700
@@ -107,7 +107,7 @@ static void __cpuinit init_intel(struct 
 	 * Note that the workaround only should be initialized once...
 	 */
 	c->f00f_bug = 0;
-	if (!paravirt_enabled() && c->x86 == 5) {
+	if (!paravirt_enabled && c->x86 == 5) {
 		static int f00f_workaround_enabled = 0;
 
 		c->f00f_bug = 1;
diff -r a6889086a657 arch/i386/kernel/entry.S
--- a/arch/i386/kernel/entry.S	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/entry.S	Thu Apr 19 15:58:47 2007 -0700
@@ -436,7 +436,7 @@ ldt_ss:
 	 * is still available to implement the setting of the high
 	 * 16-bits in the INTERRUPT_RETURN paravirt-op.
 	 */
-	cmpl $0, paravirt_ops+PARAVIRT_enabled
+	cmpl $0, paravirt_enabled
 	jne restore_nocheck
 #endif
 
diff -r a6889086a657 arch/i386/kernel/vmi.c
--- a/arch/i386/kernel/vmi.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/vmi.c	Thu Apr 19 16:00:31 2007 -0700
@@ -714,7 +714,6 @@ do {								\
  */
 static inline int __init activate_vmi(void)
 {
-	short kernel_cs;
 	u64 reloc;
 	const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc;
 
@@ -722,13 +721,11 @@ static inline int __init activate_vmi(vo
 		printk(KERN_ERR "VMI ROM failed to initialize!");
 		return 0;
 	}
-	savesegment(cs, kernel_cs);
-
-	paravirt_ops.paravirt_enabled = 1;
-	paravirt_ops.kernel_rpl = kernel_cs & SEGMENT_RPL_MASK;
+
+	paravirt_enabled = 1;
+	paravirt_backend = "vmi";
 
 	paravirt_ops.patch = vmi_patch;
-	paravirt_ops.name = "vmi";
 
 	/*
 	 * Many of these operations are ABI compatible with VMI.
diff -r a6889086a657 include/asm-i386/paravirt.h
--- a/include/asm-i386/paravirt.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/paravirt.h	Thu Apr 19 16:03:53 2007 -0700
@@ -35,11 +35,6 @@ enum paravirt_lazy_mode {
 
 struct paravirt_ops
 {
-	unsigned int kernel_rpl;
-	int shared_kernel_pmd;
- 	int paravirt_enabled;
-	const char *name;
-
 	/*
 	 * Patch may replace one of the defined code sequences with arbitrary
 	 * code, subject to the same register constraints.  This generally
@@ -420,10 +415,8 @@ unsigned paravirt_patch_insns(void *site
 		    "2" ((u32)(arg3)), [_arg4] "mr" ((u32)(arg4)),	\
 		    [_arg5] "mr" ((u32)(arg5)))
 
-static inline int paravirt_enabled(void)
-{
-	return paravirt_ops.paravirt_enabled;
-}
+extern int paravirt_enabled;
+extern char *paravirt_backend;
 
 static inline void load_esp0(struct tss_struct *tss,
 			     struct thread_struct *thread)
@@ -531,7 +524,12 @@ static inline void wbinvd(void)
 	PVOP_VCALL0(wbinvd);
 }
 
-#define get_kernel_rpl()  (paravirt_ops.kernel_rpl)
+#define get_kernel_rpl() 			\
+({						\
+	short kernel_cs;			\
+	savesegment(cs, kernel_cs);		\
+	(kernel_cs & SEGMENT_RPL_MASK);		\
+})
 
 static inline u64 paravirt_read_msr(unsigned msr, int *err)
 {
@@ -799,6 +797,8 @@ static inline void pte_update_defer(stru
 }
 
 #ifdef CONFIG_X86_PAE
+extern int use_shared_kernel_pmd;
+
 static inline pte_t __pte(unsigned long long val)
 {
 	unsigned long long ret = PVOP_CALL2(unsigned long long, make_pte,
diff -r a6889086a657 include/asm-i386/pgtable-3level-defs.h
--- a/include/asm-i386/pgtable-3level-defs.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/pgtable-3level-defs.h	Thu Apr 19 15:47:10 2007 -0700
@@ -2,7 +2,7 @@
 #define _I386_PGTABLE_3LEVEL_DEFS_H
 
 #ifdef CONFIG_PARAVIRT
-#define SHARED_KERNEL_PMD	(paravirt_ops.shared_kernel_pmd)
+#define SHARED_KERNEL_PMD	use_shared_kernel_pmd
 #else
 #define SHARED_KERNEL_PMD	1
 #endif
diff -r a6889086a657 include/asm-i386/processor.h
--- a/include/asm-i386/processor.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/processor.h	Thu Apr 19 16:01:09 2007 -0700
@@ -578,7 +578,7 @@ static inline void native_set_iopl_mask(
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
 #else
-#define paravirt_enabled() 0
+#define paravirt_enabled 0
 #define __cpuid native_cpuid
 
 static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-04-20  1:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-20  1:52 [RFC, PATCH 3/5] Paravirt_ops pure functions.patch Zachary Amsden

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.