[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-ia64-devel] pv_ops: move binary patching to later after CPU initialization
arch/ia64/kernel/paravirt.c | 8 +++++++- arch/ia64/kernel/paravirt_core.c | 17 ++--------------- arch/ia64/kernel/paravirt_entry.c | 3 ++- arch/ia64/kernel/setup.c | 3 +++ arch/ia64/xen/paravirt_xen.c | 8 +------- arch/ia64/xen/xen_pv_ops.c | 4 ++++ arch/ia64/xen/xensetup.S | 10 ---------- include/asm-ia64/paravirt.h | 1 + 8 files changed, 20 insertions(+), 34 deletions(-) So far it is still NULL for both native & xen. Thanks, eddie Defer binary patching from beginning to later after initialization is done. Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@xxxxxxxxx> diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index 37bad82..b7340dd 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c @@ -39,12 +39,18 @@ struct pv_info pv_info = { .name = "bare hardware" }; +static void native_patch(void) +{ +} + /*********************************************************************** **** * pv_init_ops * initialization hooks. */ -struct pv_init_ops pv_init_ops; +struct pv_init_ops pv_init_ops = { + .patch = native_patch, +}; /*********************************************************************** **** * pv_cpu_ops diff --git a/arch/ia64/kernel/paravirt_core.c b/arch/ia64/kernel/paravirt_core.c index 6b7c70f..003ce1f 100644 --- a/arch/ia64/kernel/paravirt_core.c +++ b/arch/ia64/kernel/paravirt_core.c @@ -21,20 +21,7 @@ */ #include <asm/paravirt_core.h> - -/* - * flush_icache_range() can't be used here. - * we are here before cpu_init() which initializes - * ia64_i_cache_stride_shift. flush_icache_range() uses it. - */ -void __init_or_module -paravirt_flush_i_cache_range(const void *instr, unsigned long size) -{ - unsigned long i; - - for (i = 0; i < size; i += sizeof(bundle_t)) - asm volatile ("fc.i %0":: "r"(instr + i): "memory"); -} +#include <asm/pgtable.h> bundle_t* __init_or_module paravirt_get_bundle(unsigned long tag) @@ -162,7 +149,7 @@ paravirt_write_inst(unsigned long tag, cmp_inst_t inst) default: BUG(); } - paravirt_flush_i_cache_range(bundle, sizeof(*bundle)); + flush_icache_range((unsigned long)bundle, (unsigned long)(bundle+1)); } /* for debug */ diff --git a/arch/ia64/kernel/paravirt_entry.c b/arch/ia64/kernel/paravirt_entry.c index 708287a..857d2a1 100644 --- a/arch/ia64/kernel/paravirt_entry.c +++ b/arch/ia64/kernel/paravirt_entry.c @@ -20,6 +20,7 @@ #include <asm/paravirt_core.h> #include <asm/paravirt_entry.h> +#include <asm/pgtable.h> /* br.cond.sptk.many <target25> B1 */ typedef union inst_b1 { @@ -56,7 +57,7 @@ __paravirt_entry_apply(unsigned long tag, const void *target) inst.l = inst_b1.l; paravirt_write_inst(tag, inst); - paravirt_flush_i_cache_range(bundle, sizeof(*bundle)); + flush_icache_range((unsigned long)bundle, (unsigned long)(bundle+1)); } static void __init diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 24561d3..6634ba7 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c @@ -987,6 +987,9 @@ cpu_init (void) void __init check_bugs (void) { +#ifdef CONFIG_PARAVIRT_GUEST + pv_init_ops.patch(); +#endif ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles, (unsigned long) __end___mckinley_e9_bundles); } diff --git a/arch/ia64/xen/paravirt_xen.c b/arch/ia64/xen/paravirt_xen.c index aa12cb5..969478e 100644 --- a/arch/ia64/xen/paravirt_xen.c +++ b/arch/ia64/xen/paravirt_xen.c @@ -28,7 +28,7 @@ const static struct paravirt_entry xen_entries[] __initdata = { }; void __init -xen_entry_patch(void) +xen_patch(void) { extern const struct paravirt_entry_patch __start_paravirt_entry[]; extern const struct paravirt_entry_patch __stop_paravirt_entry[]; @@ -39,12 +39,6 @@ xen_entry_patch(void) sizeof(xen_entries)/sizeof(xen_entries[0])); } -void __init -xen_paravirt_patch(void) -{ - xen_entry_patch(); -} - /* * Local variables: * mode: C diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c index 3601b79..a2da7b2 100644 --- a/arch/ia64/xen/xen_pv_ops.c +++ b/arch/ia64/xen/xen_pv_ops.c @@ -38,6 +38,9 @@ #include "irq_xen.h" #include "time.h" +/* TODO: move xen_patch to this file */ +extern void xen_patch(void); + /*********************************************************************** **** * general info */ @@ -157,6 +160,7 @@ xen_post_smp_prepare_boot_cpu(void) static const struct pv_init_ops xen_init_ops __initdata = { .banner = xen_banner, + .patch = xen_patch, .reserve_memory = xen_reserve_memory, diff --git a/arch/ia64/xen/xensetup.S b/arch/ia64/xen/xensetup.S index cb3432b..0df93d8 100644 --- a/arch/ia64/xen/xensetup.S +++ b/arch/ia64/xen/xensetup.S @@ -45,16 +45,6 @@ GLOBAL_ENTRY(early_xen_setup) ;; #endif -#ifdef CONFIG_PARAVIRT - /* patch privops */ -(isBP) mov r4=rp - ;; -(isBP) br.call.sptk.many rp=xen_paravirt_patch - ;; -(isBP) mov rp=r4 - ;; -#endif - br.ret.sptk.many rp ;; END(early_xen_setup) diff --git a/include/asm-ia64/paravirt.h b/include/asm-ia64/paravirt.h index 285f7ff..949ffd7 100644 --- a/include/asm-ia64/paravirt.h +++ b/include/asm-ia64/paravirt.h @@ -59,6 +59,7 @@ struct rsvd_region; struct pv_init_ops { void (*banner)(void); + void (*patch)(void); int (*reserve_memory)(struct rsvd_region *region); Attachment:
defer_patching.patch _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |