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@xxxxxxxxxx> 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) _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/virtualization